Как добавить метод к базовому типу, например Array? В глобальном модуле это будет распознано
interface Array {
remove(o): Array;
}
но где поставить фактическую реализацию?
Как добавить метод к базовому типу, например Array? В глобальном модуле это будет распознано
interface Array {
remove(o): Array;
}
но где поставить фактическую реализацию?
Вы можете использовать прототип для расширения массива:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
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);
}
}
Из TypeScript 1.6 вы можете "изначально" расширять произвольные выражения, например, встроенные типы.
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());
}
}
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!