与 `Array<T>` 子类相关的函数的 TypeScript 签名

问题描述 投票:0回答:1
我需要定义一个扩展

Objs

的类型
Array<Obj>
。我想在需要常规 
Array
 的地方使用它(例如使用 
Array.prototype.*
 函数),并且我想用一些特定于我的 
Objs
 类型的功能来扩展它。

这在 JavaScript 中是可能的,而且非常简单:

function id(val) { return val; } class Objs extends Array { objsMethod() {} } const objs1 = Objs.from([]); console.log(objs1.constructor.name); // Objs const objs2 = objs1.map(id); console.log(objs2.constructor.name); // Objs const objs3 = objs2.filter(id); console.log(objs3.constructor.name); // Objs

但是在 TypeScript 中,这些都不起作用。每个与

Array

 相关的函数都会返回 
Obj[]
 而不是 
Objs
。自己尝试一下:

function id<T>(val: T): T { return val; } class Obj {} class Objs extends Array<Obj> { objsMethod() {} } const objs1 = Objs.from([]); // Obj[] // ^? const objs2 = (objs1 as unknown as Objs).map(id); // Obj[] // ^? const objs3 = (objs2 as Objs).filter(id); // Obj[] // ^?
有什么办法可以修复它而不需要重新实现各种功能吗?

例如,我可以强制覆盖

Objs.from

Objs.prototype.filter
 等类型而不重新定义它们吗?

javascript arrays typescript inheritance extends
1个回答
0
投票
也许将目标版本更新为现代版本?

对我有用,将 TypeScript 编译为

"ES2020"

TypeScript 代码:

function id<T>(val: T): T { return val; } class Obj {} class Objs extends Array<Obj> { objsMethod() {} } const objs1 = Objs.from([]); // Obj[] console.log(objs1.constructor.name); const objs2 = (objs1 as unknown as Objs).map(id); // Obj[] console.log(objs1.constructor.name); const objs3 = (objs2 as Objs).filter(id); // Obj[] console.log(objs1.constructor.name);
// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020"
  }
}
编译为:

function id(val) { return val; } class Obj { } class Objs extends Array { objsMethod() { } } const objs1 = Objs.from([]); console.log(objs1.constructor.name); const objs2 = objs1.map(id); console.log(objs1.constructor.name); const objs3 = objs2.filter(id); console.log(objs1.constructor.name);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.