Расширение массива в машинописном

голоса
32

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

interface Array {
   remove(o): Array;
}

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

Задан 09/10/2012 в 15:33
источник пользователем
На других языках...                            


5 ответов

голоса
45

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

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Ответил 09/10/2012 в 16:11
источник пользователем

голоса
27

declare globalкажется, билет в машинописном тексте 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);
  }
}
Ответил 01/01/2017 в 04:47
источник пользователем

голоса
6

Из машинописи 1.6, вы можете «родное» расширить произвольные выражения, такие как встроенные типы.

Что нового в машинописном :

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

Распространяется положение класса ранее требовалось ссылку типа должен быть указан. Это теперь принимает выражение, необязательно следует список аргументов типа. Тип выражения должен быть типом функции конструктора по меньшей мере, одной конструкции подписи, который имеет такое же количество параметров типа, как количество аргументов типа, указанные в распространяется положение. Типа возвращаемого согласующей конструкции подписи (ами) является базовым типом, из которого типа экземпляра класса наследует. Фактически, это позволяет как реальные классы и выражение «класс типа» должны быть указаны в положении распространяется.

// 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());
    }
}
Ответил 19/10/2015 в 15:03
источник пользователем

голоса
3
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");

это работает для меня с машинопись v2.2.1!

Ответил 27/03/2017 в 15:14
источник пользователем

голоса
2

Добавление ответа Rikki Гибсона,

export{}
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);
  }
}

Без экспорта {} TS ошибка «Augmentations для глобальной области может быть непосредственно вложен только во внешних модулях или декларациях окружающей среды модуля.»

Ответил 28/03/2018 в 11:48
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more