Typescript 中对象类型定义的区别

法比安·博斯勒

我们一直致力于一个更大的项目,不同的开发人员似乎对一个相当平面的对象使用不同的类型定义,更准确地说,有两个版本脱颖而出。任何人都可以解释使用任一版本的主要区别、好处和含义吗?

type MyObject = { [_: string]: string | number }
type MyObjectAlternative = Record<string, string | number>

干杯

约塞连船长

两种类型之间存在差异。

type MyObject = { [_: string]: string | number }
type MyObjectAlternative = Record<string, string | number>

您不能在MyObject( 在 4.4 之前的 TypeScript 中) 中使用联合

type MyObject = { [_: string | number ]: string | number } // error
type MyObjectAlternative = Record<'a'|'b', string | number> // ok

type MyObject = { [_: 'a'|'b' ]: string | number } // error
type MyObjectAlternative = Record<'a'|'b', string | number> // ok

索引签名参数类型不能是联合类型。考虑使用映射对象类型代替

从 T.4.4(目前是测试版)开始,您可以使用 union 作为 MyObject 中的一种键。

type MyObject = { [_: string | number | symbol]: string | number } // allowed
type MyObjectAlternative = keyof Record<'a' | 'b', string | number> // ok

type Keys = {
    [Prop in keyof MyObject]: Prop
}

type Keys2 = {
    [Prop in keyof MyObjectAlternative]: Prop
}

正如你可能已经注意到,keyof MyObjectkeyof MyObjectAlternative运营商的工作方式不同在这两种情况下。

MyObjectAlternative在具有所有内置属性的 javascript 中更像常规对象,而MyObject被视为没有原型的对象。

此外,从 TS 4.4 开始,我们可以混合模板文字字符串:

type MyObject = { [_:  `data-${string}`]: string | number } // ok

但请记住


type MyObject = { [_:  'a'|'b']: string | number } // error

仍然不允许文字联合

打字稿 4.4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript中对象文字中的类型定义

在TypeScript中定义类型安全的通用对象访问器函数

在TypeScript中定义一个空的对象类型

TypeScript中带有对象的数组的类型定义

根据列表中对象的属性定义Typescript类型

在TypeScript中定义数组类型

内联TypeScript中的类型定义

TypeScript中的对象类型转换

TypeScript对象中的查找类型

TypeScript可选类型和类型之间的区别 未定义

对象属性路径的 TypeScript 类型定义

Typescript中具有Null和Nullable对象声明的联合类型之间的区别

在Typescript中是否可以定义'string类型数组的对象?(类型检查的正确位置?)

typescript 声明类型的区别

TypeScript定义用于合并对象,但阻止对象属性中不同类型的合并

如何定义要从TypeScript中的数组中获取其属性的对象的类型

如何基于现有对象值定义Typescript对象类型?

如何在 TypeScript 中定义带有动态键的对象类型?

如何在TypeScript中为具有动态属性的对象定义类型

如何在TypeScript中从地图的自定义键类型获取对象?

在TypeScript中,为具有必需属性的任何对象定义一种类型

在TypeScript中,如何定义提供从成员对象返回的值的方法的类型?

类型定义,用于比较(和更新)Typescript中对象的某些字段

变量定义中的类型的Typescript约定

无法在Typescript中定义类类型

在TypeScript中定义不同的通用类型的数组

在 TypeScript 中,如何指定对象中值的类型?

如何从 TypeScript 中的对象数组创建类型?

Typescript中的对象索引键类型