typescript :是否主动允许计算的对象键?

标签 typescript types

以下在 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/

相关文章:

typescript - TsconfigPathsPlugin 类型与 webpack 5 不兼容

javascript - Angular2/ typescript : access instance variable from the chaining observable function

python - 如何使用 SWIG 包装 HWND 和 HINSTANCE 类型?

Scala抽象路径依赖类型问题

JAVA——原始类型 VS 对象类型

typescript :使用 'dictionary' 类型的点符号访问属性

node.js - TypeScript console.log 不起作用

node.js - createReadStream 的 TypeScript 定义不接受选项中的 {start : 90, end: 99 }

c# - 如何检查列是否可以转换为 double ? (DataTable.Column.DataType)

java - 如何在java中获取元素的标签类型