Saltar al contenido

Cómo definir una propiedad estática en la interfaz TypeScript

Solución:

Siga la respuesta de @Bartvds de @ Duncan, aquí para proporcionar una forma viable después de que pasaron los años.

En este punto, después del lanzamiento de Typescript 1.5 (@Jun 15 '15), su interfaz útil

interface MyType {
    instanceMethod();
}

interface MyTypeStatic {
    new():MyType;
    staticMethod();
}

se puede implementar de esta manera con la ayuda del decorador.

/* class decorator */
function staticImplements<T>() {
    return <U extends T>(constructor: U) => {constructor};
}

@staticImplements<MyTypeStatic>()   /* this statement implements both normal interface & static interface */
class MyTypeClass { /* implements MyType { */ /* so this become optional not required */
    public static staticMethod() {}
    instanceMethod() {}
}

Consulte mi comentario en el número 13462 de github.

resultado visual: error de compilación con un indicio de falta de método estático.
ingrese la descripción de la imagen aquí

Una vez implementado el método estático, se indica que falta el método.
ingrese la descripción de la imagen aquí

La compilación pasó después de que se cumplieron tanto la interfaz estática como la interfaz normal.
ingrese la descripción de la imagen aquí

No puede definir una propiedad estática en una interfaz en TypeScript.

Di que querías cambiar el Date objeto, en lugar de intentar agregar a las definiciones de Date, puedes envolverlo o simplemente crear tu clase de citas enriquecidas para hacer las cosas que Date no hace.

class RichDate {
    public static MinValue = new Date();
}

Debido a que Date es una interfaz en TypeScript, no puede extenderla con una clase usando el extends palabra clave, lo cual es un poco vergonzoso, ya que sería una buena solución si date fuera una clase.

Si desea ampliar el objeto Date para proporcionar un MinValue propiedad en el prototipo, puede:

interface Date {
    MinValue: Date;
}

Date.prototype.MinValue = new Date(0);

Llamado usando:

var x = new Date();
console.log(x.MinValue);

Y si quieres que esté disponible sin una instancia, también puedes ... pero es un poco complicado.

interface DateStatic extends Date {
    MinValue: Date;
}

Date['MinValue'] = new Date(0);

Llamado usando:

var x: DateStatic = <any>Date; // We aren't using an instance
console.log(x.MinValue);

Puede definir la interfaz normalmente:

interface MyInterface {
    Name:string;
}

pero no puedes simplemente hacer

class MyClass implements MyInterface {
    static Name:string; // typescript won't care about this field
    Name:string;         // and demand this one instead
}

Para expresar que una clase debe seguir esta interfaz por sus propiedades estáticas, necesita un poco de engaño:

var MyClass: MyInterface;
MyClass = class {
    static Name:string; // if the class doesn't have that field it won't compile
}

Incluso puede mantener el nombre de la clase, a TypeScript (2.0) no le importará:

var MyClass: MyInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that field it won't compile
}

Si desea heredar de muchas interfaces de forma estática, primero deberá fusionarlas en una nueva:

interface NameInterface {
    Name:string;
}
interface AddressInterface {
    Address:string;
}
interface NameAndAddressInterface extends NameInterface, AddressInterface { }
var MyClass: NameAndAddressInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that static field code won't compile
    static Address:string; // if the class doesn't have that static field code won't compile
}

O si no desea nombrar la interfaz fusionada, puede hacer:

interface NameInterface {
    Name:string;
}
interface AddressInterface {
    Address:string;
}
var MyClass: NameInterface & AddressInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that static field code won't compile
    static Address:string; // if the class doesn't have that static field code won't compile
}

Ejemplo de trabajo

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.