Hvordan legge til en metode til en base type, sier Array? I den globale modulen vil bli gjenkjent
interface Array {
remove(o): Array;
}
men hvor du skal plassere den faktiske gjennomføringen?
Hvordan legge til en metode til en base type, sier Array? I den globale modulen vil bli gjenkjent
interface Array {
remove(o): Array;
}
men hvor du skal plassere den faktiske gjennomføringen?
Du kan bruke prototypen for å utvide Array:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
declare globalsynes å være billetten pr Loggfila 2,1. Vær oppmerksom på at Array.prototypeer av type any[], så hvis du vil ha din funksjon implementering sjekket for konsistens, best å legge en generisk type parameter selv.
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);
}
}
Fra Loggfila 1.6, kan du "opprinnelig" forlenge vilkårlige uttrykk som innebygde typer.
Maskinskrevet manuskript 1.6 gir støtte for klasser som strekker seg vilkårlig uttrykk som beregner en konstruktør funksjon. Dette betyr at innebygde typer kan nå bli utvidet i klassen erklæringer.
Den strekker seg leddet til en klasse tidligere krevde en type som referanse for å spesifiseres. Den godtar nå et uttrykk eventuelt etterfulgt av en type argumentliste. Typen av uttrykket må være en konstruktør funksjonstypen med i det minste en konstruksjon signatur som har det samme antall typeparametere som antallet av type argumenter som er angitt i den strekker leddet. Returtypen av den tilsvarende konstruksjon signatur (r) er basistypen fra hvilken klasse forekomst typen arver. Effektivt, gir dette både reelle klasser og "klasse-lignende" uttrykk for å være spesifisert i går klausulen.
// 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());
}
}
Legge til Rikki Gibson svar,
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);
}
}
Uten eksport {} TS feil "kanselliet for det globale omfang bare kan direkte nestet i eksterne moduler eller modulomgivelses erklæringer".
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");
dette fungerer for meg med Loggfila v2.2.1!