为什么tsc会报告SomeType没有索引签名?

时间:2019-05-16 11:04:14

标签: typescript

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 }

1 个答案:

答案 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];