使用`keyof typeof`

时间:2018-02-06 13:44:06

标签: typescript

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分配给foo.BAR时(这是使用foo的常用方法),它会触发错误:

  

类型'字符串'不能分配给类型'“BAR”| “BAZ”

为什么foo.BAR被解释为string而不是"BAR"字符串类型?

如何解决这个问题?还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:1)

对于常量,常量的类型变为字符串文字类型,对于对象文字,字段被推断为字符串。这个issue提到了这个问题,推理是:

  

这是正确的行为,因为我可能会更新n0.A =' B'而且我不希望看到一个错误类型' A'与' B'

不兼容

所以基本上你可以做foo即使const foo = { BAR: 'BAR' as 'BAR', BAZ: 'BAZ' as 'BAZ' }; 是一个常数

您可以将类型强制为文字类型,但是如上面的示例所示,如果从javascript中可以看到对象,那么它就不是很安全(typescript将不允许上面的赋值):

public class GlobalVariables  
{
    public static string databasePath = Android.App.Application.Context.FilesDir.Path;
    ...
}