typescript - 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;
}
我不明白为什么会这样?有没有办法解决这个问题?
解决方案
对象属性始终是字符串。它按预期工作。
让我们添加一些无法强制转换为数字的内容:
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]
推荐阅读
- flask - Flask Admin:将相关对象的属性添加到模型视图中的列列表
- regex - 逗号分隔列表的正则表达式
- sql - 使用 vb.net 在 sql db 中调用列的最大值
- php - PHP OCI:连接字符串(从 JDBC 转换)
- angular - 如果它们在动态组件中使用,我是否需要取消订阅`route.params` observable
- android - 文件不匹配时如何显示消息
- javascript - 如何将变量输入到函数的返回命令中?
- javascript - 如何在点击时切换菜单
- character - 如何为西班牙语键盘显示西班牙语重音字符?
- c - 用于检查值是否存在于链表中的 c 函数