Подтвердить что ты не робот

Расширение массива в TypeScript

Как добавить метод к базовому типу, например Array? В глобальном модуле это будет распознано

interface Array {
   remove(o): Array;
}

но где поставить фактическую реализацию?

4b9b3361

Ответ 1

Вы можете использовать прототип для расширения массива:

interface Array<T> {
   remove(o: T): Array<T>;
}

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}

Ответ 2

declare global кажется билетом как TypeScript 2.1. Обратите внимание, что Array.prototype имеет тип any[], поэтому, если вы хотите, чтобы ваша реализация функции проверялась на согласованность, лучше всего добавить параметр общего типа.

declare global {
  interface Array<T> {
    remove(elem: T): Array<T>;
  }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
    return this.filter(e => e !== elem);
  }
}

Ответ 3

Из TypeScript 1.6 вы можете "изначально" расширять произвольные выражения, например, встроенные типы.

Что нового в TypeScript:

TypeScript 1.6 добавляет поддержку классов, расширяющих произвольное выражение который вычисляет функцию-конструктор. Это означает, что встроенные типы теперь могут быть расширены в объявлениях классов.

В предложении extends класса ранее требовалась ссылка типа указывается. Теперь он принимает произвольное выражение, за которым следует введите список аргументов. Тип выражения должен быть конструктором тип функции с хотя бы одной конструктивной сигнатурой, которая имеет тот же количество параметров типа в виде числа аргументов типа, указанных в предложение extends. Возвращаемый тип соответствующей конструкции подпись является базовым типом, из которого тип экземпляра класса наследует. Эффективно это позволяет использовать как реальные классы, так и "классные", выражения, которые должны быть указаны в предложении extends.

// Extend built-in types

class MyArray extends Array<number> { }
class MyError extends Error { }

// Extend computed base class

class ThingA {
    getGreeting() { return "Hello from A"; }
}

class ThingB {
    getGreeting() { return "Hello from B"; }
}

interface Greeter {
    getGreeting(): string;
}

interface GreeterConstructor {
    new (): Greeter;
}

function getGreeterBase(): GreeterConstructor {
    return Math.random() >= 0.5 ? ThingA : ThingB;
}

class Test extends getGreeterBase() {
    sayHello() {
        console.log(this.getGreeting());
    }
}

Ответ 4

class MyArray<T> extends Array<T> {
    remove: (elem: T) => Array<T> = function(elem: T) {
        return this.filter(e => e !== elem);
    }
}
let myArr = new MyArray<string>();
myArr.remove("some");

это работает для меня с typescript v2.2.1!