Сигнатуры TypeScript для функций, относящихся к подклассам `Array`Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Сигнатуры TypeScript для функций, относящихся к подклассам `Array`

Сообщение Anonymous »

Мне нужно определить тип Objs, который расширяет Array. Я хотел бы использовать его там, где ожидается обычный массив Array (например, с функциями Array.prototype.*), и я хотел бы расширить его некоторыми функциями, специфичными для моих объектов. code> type.
Это возможно и очень просто в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»