提问人:Zarina Nugmanova 提问时间:7/26/2022 最后编辑:Zarina Nugmanova 更新时间:7/26/2022 访问量:705
混合类型的对象值打字稿
Mixed types of object value typescript
问:
我有一个关于对象值中的混合类型的问题
我有一个带有接口的空对象,稍后我用代码填充它。我给它添加字符串和数字。
interface CardDataObject {
[key: string]: any
}
const data: CardDataObject = {}
data.number = number
data.string = string
这就是我以后添加项目的方式
有了“any”,一切都很好,但我的老师说我必须更好地定义它,而不是“any”类型
有没有办法为事先不知道值类型的对象创建一个通用接口?
答:
1赞
Guerric P
7/26/2022
#1
你的老师是对的,就是不惜一切代价避免,因为它基本上禁用了 TypeScript,所以就像你写的是普通的 JavaScript。any
你给它添加字符串和数字吗?然后像这样输入:
interface CardDataObject {
[key: string]: string | number
}
最短变体:
type CardDataObject = Record<string, string | number>
评论
0赞
Zarina Nugmanova
7/26/2022
我确实尝试过字符串 |数字,但随后我遇到了类似“Type 'string |number“不能分配给类型”string”。类型'number'不能分配给类型'string'。例如,我确实通过 data.numbers = numbers 和 data.string = string 添加字符串和数字
0赞
Zarina Nugmanova
7/26/2022
它给了我同样的错误 Record<string, string |数字>顺便说一句
0赞
Telman
7/26/2022
#2
我认为不可能事先根本不知道类型,打字稿至少需要知道一系列可能的类型。
请查看以下选项:
- 如果你知道你将只将你的接口与数字和字符串(也许还有其他)一起使用,你可以使用然后输入,它看起来像 -
union
number | string
举个例子:
interface CardDataObject {
[key: string]: number | string
}
const data: CardDataObject = { key1: 'text', key2: 100 };
活接头类型 - https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types
- 如果您希望它适用于所有可能的类型,另一种选择是使用“泛型”。您可以声明一个具有泛型类型的接口,然后稍后选择它应该是哪种类型。
举个例子:
interface CardDataObject<T> {
[key: string]: T
}
const dataNumbers: CardDataObject<number> = { key1: 100 };
const dataStrings: CardDataObject<string> = { key1: 'text' };
Typescript 泛型 - https://www.typescriptlang.org/docs/handbook/2/generics.html
评论