2017-09-13 3 views
0

J'ai créé une extension de base sur l'objet Date, et cela fonctionne correctement. Voici mon code:La propriété n'existe pas sur le type 'MyObject' - Extension Typescript

date.extensions.ts

export {} 

declare global { 
    interface Date { 
     toSQLiteString(): string; 
    } 
} 

Date.prototype.toSQLiteString = function() { 
    let tzo = -this.getTimezoneOffset(); 
    let dif = tzo >= 0 ? '+' : '-'; 
    let pad = function(num) { 
     let norm = Math.abs(Math.floor(num)); 
     return (norm < 10 ? '0' : '') + norm; 
    }; 

    return this.getFullYear() + 
     '-' + pad(this.getMonth() + 1) + 
     '-' + pad(this.getDate()) + 
     'T' + pad(this.getHours()) + 
     ':' + pad(this.getMinutes()) + 
     ':' + pad(this.getSeconds()) + 
     dif + pad(tzo/60) + 
     ':' + pad(tzo % 60); 
}; 

Maintenant, je veux créer un fichier d'extension sur un objet personnalisé, permet de l'appeler MyModel. Cet objet est défini dans un autre fichier et ressemble donc (exemple très simple)

export class MyObject { 
    id: number = 0; 
    name: string = '' 
} 

Maintenant, je veux créer un fichier appelé MyObject.extensions.ts et ont une fonction d'extension, donc j'ai créé cela et le fichier ressemble si

import { MyObject } from './my-object.ts' 

export {} 

declare global { 
    interface MyObject { 
     getIdAndName(): string; 
    } 
} 

MyObject.prototype.getIdAndName = function() { 
    return this.id + ' - ' + this.name; 
}; 

Mais, pour une raison quelconque je reçois une erreur par tapuscrit

enter image description here

Si toutefois, je retire la import en haut du fichier, l'erreur disparaît, mais je reçois une autre erreur, comme ci-dessous

enter image description here

J'utilise tapuscrit 2.4.2

Tous suggestions très appréciés

+0

Vous ferez probablement avec donner différents noms à l'interface et à la classe. Vous ne pouvez pas modifier les types. Votre classe est une valeur et peut être modifiée. –

Répondre

1

Votre classe est pas dans l'espace de noms global, il est dans un module, vous devez étendre la déclaration du module:

import { MyObject } from './my-object' 

export {} 

declare module './my-object' { 
    interface MyObject { 
     getIdAndName(): string; 
    } 
} 

MyObject.prototype.getIdAndName = function() { 
    return this.id + ' - ' + this.name; 
}; 

Supprimez également l'extension .ts de l'importation de votre module.

+0

Cela fonctionne merci. Bien que savez-vous si vous pouvez prolonger un objet et faire fonctionner les extensions déclarées sur l'objet de base? Bien que cela compile, quand je l'exécute, il dit que le "nouvel" objet n'a pas la fonction ... quand il est déclaré sur l'objet de base – Gillardo

+0

@Gillardo désolé pour la réponse tardive, dites votre nouvelle question, j'ai répondu là –