首页 > 解决方案 > Typescript:计算属性时的类型强制

问题描述

打字稿版本:4.2.3

我想将联合的值作为对象文字类型的键,如下所示:

type Values = "888" | "123"
type Something = {
  [key in Values] : number
}

这样我就可以访问对象值,例如something["888"].

但结果不是我想要的:

// What I want:
// property are **string** type
type Something = {
  "888": string;
  "123": string;
}

// But the real result is:
// property became **number** type. 
type Something = {
  888: string;
  123: string;
}

我不明白为什么会这样?有没有办法解决这个问题?

标签: typescript

解决方案


对象属性始终是字符串。它按预期工作。

让我们添加一些无法强制转换为数字的内容:

type Values = "888" | "123" | "asdf"
type Something = {
  [key in Values] : number
}

现在,如果您将鼠标悬停在上面,Something您应该会看到:

type Something = {
    888: number;
    123: number;
    asdf: number;
}

在类型的弹出窗口中,它显示了不带引号的属性,因为这是对象文字将使用的语法。

例如:

const foo: Something = {
  888: 123,
  123: 456,
  asdf: 789,
}
const foo888 = foo["888"]

这里对象foo具有名称"888""123"的属性"asdf"


在纯 javascript 对象中,总是将它们的属性名称存储为字符串。但是强制数字是允许的。Typescript 可以让你做同样的事情:

// both work fine
const foo888string = foo["888"]
const foo888number = foo[888]

推荐阅读