打字稿:主动允许计算对象键吗?

时间:2017-10-30 20:01:38

标签: typescript types

以下在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的评论。

1 个答案:

答案 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;