打字脚本泛型-扩展对象是没有意义的吗?最佳实践是什么?脚本、意义

由网友(谁是谁的谁≈)分享简介:我注意到泛型通常是没有意义的,因为基本上javascript中的所有东西都是对象。大多数文本都是使用.toString方法的对象。字符串是具有.long属性的对象,等等。我只喜欢,但很好奇其他人注意到了什么。我现在没有好的例子,我更多的是想听听别人的经验。推荐答案有关详细信...

我注意到<P extends object>泛型通常是没有意义的,因为基本上javascript中的所有东西都是对象。大多数文本都是使用.toString方法的对象。字符串是具有.long属性的对象,等等。我只喜欢<P>,但很好奇其他人注意到了什么。

我现在没有好的例子,我更多的是想听听别人的经验。

推荐答案

脚本出现错误是什么意思

有关详细信息,请参阅"The object Type in TypeScript"。

特别引入了object type,以排除stringnumberbooleanbigintsymbolundefinednull七种类型。(是的,在运行时typeof null === "object",但在JS和TS中仍然被认为是原始的)。确实,当您访问StringNumberBooleanBigIntSymbol对象上的成员时,stringnumberbooleanbigintsymbol值将分别自动包装在这些对象中。但它们与真实对象是可区分的,有时这会有所不同。TypeScrip手册中给出的示例是Object.create(),如果传递原语类型的参数(null除外),则会导致运行时错误。因此,类型脚本的Object.create()类型指定其参数的类型为object | null。如果您希望您的泛型参数排除原语,<P extends object>将是正确的方法...所以这并不是毫无意义的。

请注意,在TypeScrip中也有一个Object接口,以大写字母O开始。该接口包含存在于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 {}>几乎毫无用处。

但是,从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

阅读全文

相关推荐

最新文章