gpt4 book ai didi

typescript 泛型 - "extends object"毫无意义吗?最佳做法是什么?

转载 作者:行者123 更新时间:2023-12-03 16:01:13 27 4
gpt4 key购买 nike

我注意到 <P extends object>泛型通常毫无意义,因为基本上 javascript 中的所有内容都是一个对象。大多数文字是具有 .toString 方法的对象。字符串是具有 .length 属性等的对象。我更喜欢 <P>但很好奇其他人注意到了什么。
我现在没有很好的例子,我只是想听听其他人的经历。

最佳答案

"The object Type in TypeScript"了解更多信息。
object type在 TypeScript 中专门引入了排除这七个 primitive类型,string , number , boolean , bigint , symbol , undefined , 和 null . (是的,typeof null === "object" 在运行时,但它在 JS 和 TS 中仍然被认为是原始的)。确实string , number , boolean , bigint , 和 symbol值将自动包装在 String 中, Number , Boolean , BigInt , 和 Symbol对象(分别)当您访问它们上的成员时,就好像它们是对象一样。但它们与真实物体是有区别的,有时这会有所不同。 TypeScript 手册中给出的示例是 Object.create() ,如果传递原始类型的参数(null 除外),则会导致运行时错误。因此 TypeScript 键入 Object.create()指定其参数的类型为 object | null .如果您希望通用参数排除原语,<P extends object>将是正确的方法......所以它不是毫无意义的。
请注意,还有一个 Object TypeScript 中的接口(interface),以大写 O 开头.这个接口(interface)包含存在于 JS 中的所有东西的(明显的)成员,比如 valueOf()toString() .当你说“一切都是对象”时,它可能更接近你的想法;仅限 nullundefined不能分配给 Object .不过一般来说,you probably don't want to use the Object type in TypeScript ;这种包装器类型几乎不是人们想要使用的。
如果你真的想捕捉“任何可以像对象一样被索引的东西”,你可能应该使用所谓的“空对象”类型,{} .这是一个没有已知属性的对象类型,其行为类似于 Object .同样,只有 nullundefined不能分配给 {} .事实上,过去不受约束的泛型类型参数(如 <P> 而不是 <P extends Q> )被隐式约束为 {} .所以以前写 <P extends {}> 是毫无用处的。 .
然而,从 TypeScript 3.5 开始,unconstrained generics are now given an implicit constraint of unknown instead of {} . unknown type 在 TypeScript 中确实是“一切”。您可以将任何值赋给 unknown 类型的变量。 (但反之亦然)。写<P extends unknown>真的没意义.
我们不妨以 any 结束。 ,终极的“无所不能”类型。您不仅可以将任何内容分配给 any (如 unknown ),您也可以分配 any任何东西(如 never )。使用 any就像举手放弃;它更多的是禁用类型检查,而不是实际类型。 Since TypeScript 3.9 , 写作 <P extends any>与写 <P extends unknown> 相同,因此同样没有意义。 (过去 <P extends any> 允许您在 P 未解决时将 any 视为 P,就像在通用函数实现中一样,但这被认为是愚蠢的并已更改。)
Playground link to code

关于 typescript 泛型 - "extends object"毫无意义吗?最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65945173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com