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
等类型而不重新定义它们吗?
对我有用,将 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);