为什么此字符串文字可分配给`keyof X`但不能用作'X'的键?

时间:2019-07-15 20:47:12

标签: typescript

我找到了一个示例,其中tsc-3.5.3思考语句

let k : keyof typeof c = "value";

是合法的,但声明

c["value"]

不是。

我对为什么会发生这种情况或我错过了什么感到困惑。这是完整的代码段:

type A = { keys: "value1" | "value2" };

<B extends A>() => {
    type C = { [ item in B["keys"] ] ?: any };
    let c : C = {};

    let k : keyof typeof c = "value1";
    // tsc think this is legit

    c[k]
    // also legit

    c["value1"]
    // tsc complains:
    // "Property 'value1' does not exist on type 'C'.ts(7053)"
};

请注意,当我将"value1"替换为"valueX"时,就像这样:

let k : keyof typeof c = "valueX";

tsc随后将抱怨Type '"valueX"' is not assignable to type 'B["child"]'。 换句话说,tsc知道"value1"c的合法密钥,而"valueX"不是。

有人可以帮助我了解这是怎么发生的吗?

谢谢!

0 个答案:

没有答案