Как добавить метод базового типа, скажем, массив? В глобальном модуле это будет признано
interface Array {
remove(o): 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кажется, билет в машинописном тексте 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);
}
}
Из машинописи 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());
}
}
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!
Добавление ответа 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 для глобальной области может быть непосредственно вложен только во внешних модулях или декларациях окружающей среды модуля.»