type Valid = 'A' | 'B'
type SomeType = { [index in Valid]: string }
const x: SomeType = {
A: 'foo',
B: 'foo',
};
let idx = 'A';
const v1 = x[idx];
在上述代码段上运行tsc会显示错误Element implicitly has an 'any' type because type 'SomeType' has no index signature
。
这里没有为SomeType
提供签名:
type SomeType = { [index in Valid]: string }
?
答案 0 :(得分:1)
发生错误是因为打字稿仅在可以证明访问有效的情况下才允许索引访问(在noImplictAny
选项下)。这意味着x["A"]
是有效的,但类型为x
的随机变量string
无效。
string
,而是作为字符串文字类型的并集(可以作为索引目标的键),那么Typescript还可以让您执行访问。所以这也可以工作:
let idx: "A" | "B" = 'A';
const v1 = x[idx];
或者您可以使用keyof
类型运算符来获得所有可能类型的并集:
let idx: keyof SomeType = 'A';
const v1 = x[idx];
或者您可以使用const
而不是强迫编译器为idx
推断字符串文字类型(如果它不变):
const idx = 'A'; // idx is of type 'A'
const v1 = x[idx];
或者您可以使用const
断言来告诉编译器即使对于let
声明也不要扩展文字类型(尽管`idx只有一个可能的值)
let idx = 'A' as const; // idx is of type 'A'
const v1 = x[idx];