Это возможно и очень просто в 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(val: T): T { return val; }
class Obj {}
class Objs extends Array {
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 и т. д. без их переопределения?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -of-arrayt