我们一直致力于一个更大的项目,不同的开发人员似乎对一个相当平面的对象使用不同的类型定义,更准确地说,有两个版本脱颖而出。任何人都可以解释使用任一版本的主要区别、好处和含义吗?
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 MyObject
和keyof MyObjectAlternative
运营商的工作方式不同在这两种情况下。
MyObjectAlternative
在具有所有内置属性的 javascript 中更像常规对象,而MyObject
被视为没有原型的对象。
此外,从 TS 4.4 开始,我们可以混合模板文字字符串:
type MyObject = { [_: `data-${string}`]: string | number } // ok
但请记住
type MyObject = { [_: 'a'|'b']: string | number } // error
仍然不允许文字联合
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句