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"
字符串类型?
如何解决这个问题?还有其他方法可以实现吗?
答案 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;
...
}