使用`keyof typeof`将字符串值限制为对象键

By simon at 2018-02-07 • 0人收藏 • 20人看过

barOrBaz值应限制为foo常量键:

const foo = {
  BAR: 'BAR',
  BAZ: 'BAZ'
};

let barOrBaz: keyof typeof foo; // type: "BAR" | "BAZ"
const BAR = 'BAR';

barOrBaz = BAR; // ok
barOrBaz = 'BAZ'; // ok
barOrBaz = foo.BAR; // Type 'string' is not assignable to type '"BAR" | "BAZ"
问题是,当barOrBaz是assigden到foo.BAR(这是 通常的方式如何使用foo),它会触发一个错误:

输入'string'不是assignable键入'“BAR”| “BAZ” 为什么foo.BAR被解释为string而不是"BAR"字符串 类型? 这怎么可能呢?固定的?还有其他的方法来实现这个吗?

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

对于常量,常量的类型成为字符串文字类型 对象文字的字段被推断为字符串。这个 [问题](https://github.com/Microsoft/TypeScript/issues/15121)提到这一点 问题和推理是:

这是正确的行为,因为我可能更新n0.A ='B',我不期望 看到类型“A”与“B”不兼容的错误 所以基本上你可以做foo.BAR = 'baz'甚至在foo是一个常数 你可以强制类型的文字类型,但如上面的例子多显示 如果对象是可见的从javascript(打字稿将是不安全的 不允许上面的任务):

const foo = {
    BAR: 'BAR' as 'BAR',
    BAZ: 'BAZ' as 'BAZ'
};

登录后方可回帖

Loading...