1

这个功能

function abc<K extends keyof any>(
  param: K,
) {
  const z: { [p in K]: string } = {
    [param]: 'abc',
  };
}

给出以下错误:

TS2322: Type '{ [x: string]: string; }' is not assignable to type '{ [p in K]: string; }'.

在打字稿中不是这样的事情吗?我正在使用打字稿 4.3.5

谢谢

何塞

4

1 回答 1

0

您收到此错误,因为 TS 不确定K泛型参数。它是编译器的黑匣子。

看这个例子:

function abc<K extends PropertyKey>(
    param: K,
) {
    const z: { [p in K]: string } = {
        [param]: 'abc',
    };

    return z
}

const result2 = abc<42 | 'prop' | symbol>('prop')

keyof any与内置相同PropertyKey。此外,PropertyKey是联合类型,因此K也可能是联合。

考虑上面的例子。K是一个42 | 'prop' | symbol完全有效的类型并且满足要求。

因为K是工会,理论上z应该是{ [p in 42 | 'prop' | symbol]: string }吧?所以我们应该得到一个具有三个属性的对象?但是你只提供了一个。

同样,因为KTS 编译器是一个黑匣子,所以做出任何假设都是不安全的。

相关答案

于 2021-09-29T09:02:03.290 回答