混合类型的对象值打字稿

Mixed types of object value typescript

提问人:Zarina Nugmanova 提问时间:7/26/2022 最后编辑:Zarina Nugmanova 更新时间:7/26/2022 访问量:705

问:

我有一个关于对象值中的混合类型的问题

我有一个带有接口的空对象,稍后我用代码填充它。我给它添加字符串和数字。

interface CardDataObject {
    [key: string]: any
}

const data: CardDataObject = {}

data.number = number
data.string = string

这就是我以后添加项目的方式

有了“any”,一切都很好,但我的老师说我必须更好地定义它,而不是“any”类型

有没有办法为事先不知道值类型的对象创建一个通用接口?

TypeScript TypeScript 泛型对象 类型

评论


答:

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

我认为不可能事先根本不知道类型,打字稿至少需要知道一系列可能的类型。

请查看以下选项:

  1. 如果你知道你将只将你的接口与数字和字符串(也许还有其他)一起使用,你可以使用然后输入,它看起来像 -unionnumber | 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

  1. 如果您希望它适用于所有可能的类型,另一种选择是使用“泛型”。您可以声明一个具有泛型类型的接口,然后稍后选择它应该是哪种类型。

举个例子:

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

操场