typescript - 我可以使用包含变量的模板文字作为对象键吗?

标签 typescript template-literals

我期望以下代码能够工作,但我不确定为什么它不起作用:

interface Person {
  firstName: string
}

const property: 'Name' = 'Name'

const zack: Person = {
  [`first${property}`]: 'Zack'
}

创建 zack 会引发错误:

Property 'firstName' is missing in type '{ [x: string]: string; }' but required in type 'Person'.

再多研究一下,任何字符串连接似乎都是问题:

type EqualsFirstName = 'firstName'

const value: EqualsFirstName = 'first' + 'Name'

这也行不通。

最佳答案

TypeScript 编译器在评估映射类型时相当严格。有很多事情与他们不能很好地配合,这就是其中之一。当您断言类型时它会起作用:

const zack: Person = {
    [`first${property}` as 'firstName']: 'Zack'
}

尽管如下面的代码所示,这并不是真正有用,它也可以很好地编译,但在运行时会严重失败:

const property: 'Foo' = 'Foo'

const zack: Person = {
  [`first${property}` as 'firstName']: 'Zack'
}

另一个(有点笨拙)选项是用 as 断言类型 Person (并首先对 unknown 进行断言):

const zack = {
  [`first${property}`]: 'Zack'
} as unknown as Person

与第一个选项一样,如果断言无效,这不会在运行时为您提供帮助。

我建议您尝试不使用这种表示法,并选择更“TS 编译器友好”的方式。这是一个非常不寻常的构造,在技术上是有效的,但在实践中您宁愿避免。

关于typescript - 我可以使用包含变量的模板文字作为对象键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57045949/

相关文章:

javascript - Nativescript:如何从图库获取照片列表

javascript - 如何将 typescript 项目与 html 集成

javascript - 如何获取 Typescript 中的基本类型?

javascript - 为什么在 javaScript 中类型转换为字符串时,let 不被识别为关键字?

javascript - 离开拥抱方法如何从forEach返回?

javascript - JS ES6 模板文字和数字的前导/后缀零

javascript - es6 javascript推荐使用三元运算符应用模板文字的方法?

javascript - 将字符串分隔符更改为反引号 : possible impact?

javascript - 使用模板文字在 javascript 中构建多行字符串

javascript - 与 RxJS 流冲突的条件语句