由网友(谁是谁的谁≈)分享简介:我注意到泛型通常是没有意义的,因为基本上javascript中的所有东西都是对象。大多数文本都是使用.toString方法的对象。字符串是具有.long属性的对象,等等。我只喜欢,但很好奇其他人注意到了什么。我现在没有好的例子,我更多的是想听听别人的经验。推荐答案有关详细信...![脚本出现错误是什么意思](https://p.xsw88.cn/allimgs/daicuo/20230903/4117.png)
我注意到<P extends object>
泛型通常是没有意义的,因为基本上javascript中的所有东西都是对象。大多数文本都是使用.toString方法的对象。字符串是具有.long属性的对象,等等。我只喜欢<P>
,但很好奇其他人注意到了什么。
我现在没有好的例子,我更多的是想听听别人的经验。
推荐答案
![脚本出现错误是什么意思](https://p.xsw88.cn/allimgs/daicuo/20230903/4117.png)
有关详细信息,请参阅"The object
Type in TypeScript"。
object
type,以排除string
、number
、boolean
、bigint
、symbol
、undefined
和null
七种类型。(是的,在运行时typeof null === "object"
,但在JS和TS中仍然被认为是原始的)。确实,当您访问String
、Number
、Boolean
、BigInt
和Symbol
对象上的成员时,string
、number
、boolean
、bigint
和symbol
值将分别自动包装在这些对象中。但它们与真实对象是可区分的,有时这会有所不同。TypeScrip手册中给出的示例是Object.create()
,如果传递原语类型的参数(null
除外),则会导致运行时错误。因此,类型脚本的Object.create()
类型指定其参数的类型为object | null
。如果您希望您的泛型参数排除原语,<P extends object>
将是正确的方法...所以这并不是毫无意义的。
请注意,在TypeScrip中也有一个Object
接口,以大写字母O
开始。该接口包含存在于JS中的所有内容上的(明显的)成员,如valueOf()
和toString()
。这可能更接近您所说的一切都是对象,只有null
和undefined
不可分配给Object
。不过,一般来说,you probably don't want to use the Object
type in TypeScript;这样的包装器类型几乎不是人们想要使用的。如果您确实想捕获任何可以编制索引的内容,例如对象,您可能应该使用所谓的空对象类型{}
。这是一个没有已知属性的对象类型,其行为类似Object
。同样,只有null
和undefined
不可分配给{}
。事实上,过去的情况是不受约束的泛型类型参数(如<P>
而不是<P extends Q>
)被隐式约束为{}
。因此,在过去,写<P extends {}>
几乎毫无用处。
但是,从TypeScrip 3.5开始,unconstrained generics are now given an implicit constraint of unknown
instead of {}
。unknown
类型实际上是打字脚本中的所有内容。您可以将任何值赋给unknown
类型的变量(但反之亦然)。写<P extends unknown>
确实没有意义。
我们不妨以any
来结束,这是终极的任何东西都会去的类型。您不仅可以将任何内容分配给any
(如unknown
),还可以将any
分配给任何内容(如never
)。使用any
就像是举手放弃;与其说它是一个实际的类型,不如说是禁用了类型检查。Since TypeScript 3.9,写字<P extends any>
和写字<P extends unknown>
一样,同样没有意义。(过去,<P extends any>
允许您在P
未解析时将P
视为LIKEany
,就像在泛型函数实现中一样,但这被认为是愚蠢的,并已更改。)
Playground link to code
相关推荐
最新文章