以下在Typescript 2.5.3中编译良好:
POST yet_another_index/my_type/_search
{
"query": {
"match": {
"message.lowercased": "pravda"
}
}
}
"hits": {
"total": 1,
"max_score": 0.25316024,
"hits": [
{
"_index": "yet_another_index",
"_type": "my_type",
"_id": "AV9u1qZmB9pi5Gaw0rj1",
"_score": 0.25316024,
"_source": {
"message": "Oct 29 11:38:46 1893 192.168.1.114 TCP_MISS/200 153925 GET http://www.pravda.ru/science/ - DIRECT/185.103.135.90 text/html"
}
}
]
}
但这不是:
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"
const)由于当前Typescript编译器的限制而暂时被忽略了?
编辑以澄清:
请阅读以上内容:“TS规范是否保证动态属性不会导致编译错误?”每个Juan Mendes的评论。
答案 0 :(得分:2)
The spec并不保证您无法检查动态属性。
正如上面的链接所解释的,TypeScript仅在检查类型时检查文字对象的静态部分,而不是动态[属性]。允许它们在对象上,但如果没有强制转换或括号访问,则无法检索它。
您的代码几乎与您完成的代码相同
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;