对象文字中的动态键访问导致扩大的打字稿签名

Posted

技术标签:

【中文标题】对象文字中的动态键访问导致扩大的打字稿签名【英文标题】:Dynamic key access in object literal results in widened typescript signature 【发布时间】:2020-02-14 06:20:53 【问题描述】:

对于以下代码:

const x = 
    a: 'c',
    b: 'd'
;

const y = 
    [x.a]: 'e',

生成的类型有:

typeof x -> 
    a: string,
    b: string


typeof y -> 
  [x: string]: string

预期类型:

typeof y -> 
  c: string

SO 上的类似 issue 有一个与此处无关的解决方案

在 Github 上找到报告的 issue,它说这是已修复但不知何故无法正常工作

【问题讨论】:

【参考方案1】:

那是因为typeof x.a 实际上是一个字符串。这里,x 是常量,但x.a 的值可以更改为任何字符串值。

如果x.a 的值不会改变,那么可能的解决方案(使用const assertion 在打字稿版本3.4 中添加):

const x = 
    a: 'c',
    b: 'd'
 as const;

const y = 
    [x.a]: 'e',


typeof y -> 
    c: string

【讨论】:

谢谢!但要注意,这将适用于 3.4 及更高版本。对于较旧的,我们将不得不执行以下操作: const x = a: 'c' as 'c', b: 'd' as 'd' 。您能否更新答案以反映版本信息? 谢谢,我会做的。 @HarshVyas 您的编辑引入了一个错字:您的意思是 v 3.4 而不是 4.3!

以上是关于对象文字中的动态键访问导致扩大的打字稿签名的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿中获取字典/对象键作为元组

如何使用带有动态对象键的打字稿

如何访问打字稿文件中的css类?

如何将对象数组转换为在打字稿中具有动态键的单个对象

带有动态键的打字稿通用函数

打字稿中对象文字的类型安全合并