【发布时间】:2020-04-07 07:08:12
【问题描述】:
既然这样有效:
const f = <T extends string>(x: T) => x;
f("");
interface Dictionary<T> { [key: string]: T; }
const dict: Dictionary<number> = { a: 1 };
我希望以下代码也能正常工作:
interface MyRecord<Key extends string, Value> { [_: Key]: Value };
但编译器报告_:
An index signature parameter type must be 'string' or 'number'.
将Key extends string 更改为Key extends string | number 没有任何作用(同样的错误)。
它失败的原因是什么?看起来如何是正确的解决方案?(最好不要使用Any 和类似的。)
编辑1:
type XY = 'x' | 'y';
const myXY: XY = 'x';
const myString: string = myXY;
由于这可行,我假设索引类型具有相同的保留(string 的子集可以构成索引类型所需的string 角色)。
【问题讨论】:
-
What is the Record type in typescript? 的可能重复(好吧,无论如何都是答案)
-
两者似乎都不是重复的。 stackoverflow.com/questions/51936369/… 正在询问
Record是什么,并且使用非常相似(如果不相同)的代码,这些代码似乎对他们有用,而对我却不适用。 stackoverflow.com/questions/46885489/… 的答案实际上说要使用映射类型,这似乎与我的(不工作的)代码所做的完全一样。 -
您没有使用映射类型
{[P in K]: V},您正在尝试使用索引签名{[p: K]: V}。它们看起来很相似,但却是不同的东西(后者是一个错误...K只能是索引签名中的string或number) -
哦,你是对的。仍然不明白为什么它不适用于索引类型。为什么它说
Key extends string不是string的子集?'a'|'b'(或任何字符串联合)不是string的子集吗?
标签: typescript