以下在 Typescript 2.5.3 中编译良好:
interface Test {
test: string
}
const anything = 'someDifferentKey';
const a: Test = {
[anything]: true, // no error
test: 'whatever'
}
但这不是:
interface Test {
test: string
}
const a: Test = {
someDifferentKey: true, // error
test: 'whatever'
}
我的问题是 - 依赖计算对象键是否“安全”总是被允许与类型化对象定义一起标记,或者计算属性是否基于常量值(例如 "some"+"differentKey"
或上面引用的 anything
常量)由于当前 Typescript 编译器的限制而暂时忽略了吗?
编辑澄清:
阅读上面的内容:“TS 规范是否为我提供动态属性永远不会导致编译错误的任何保证?” 根据 Juan Mendes 的评论。
最佳答案
The spec不向您保证它永远不会检查动态属性。
正如上面的链接所解释的,TypeScript 在检查类型时只检查文字对象的静态部分,而不是动态 [properties]。它们可以出现在对象上,但如果不进行强制转换或括号访问,您将无法检索它。
你的代码几乎和你做的一样
interface Test {
test: string
}
const anything = 'someDifferentKey';
const a: Test = {
test: 'whatever'
}
a[anything]: true, // no error because brackets bypass type safety
也就是说,仅仅因为您向对象添加了一个属性,并不意味着您可以使用类型安全来检索它。
a.someDifferentKey = false; // ERROR
// You would need
a[anything] = false;
关于 typescript :是否主动允许计算的对象键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47023288/