2017-09-04 1 views
1

J'essaie d'utiliser ce code:décorateur Singleton dactylographiée

function singleton<T extends { new() }>(constructor: T): T { 
    return new constructor() 
} 

@singleton 
export default class SomeClass { 
    constructor() {} 

    public method(): string { 
     return 'Hello!' 
    } 
} 

console.log(SomeClass.method()) 

Et cela fonctionne. Le message "Bonjour!" est affiché dans la console. Mais le compilateur dactylographié dit qu'il y a une erreur: enter image description here

Qu'est-ce qui ne va pas?

+1

Probablement le compilateur ne s'attend pas à ce qu'un décorateur change le type d'une 'classe' à celle d'un objet. Et il est en bonne compagnie là-bas - tu ne devrais pas faire ça. Pour écrire des singletons, utilisez 'const SomeClass = {public method(): string { return 'Bonjour!' } }; 'et d'en finir! – Bergi

Répondre

1

Malheureusement, le compilateur ne peut pas savoir quelles modifications le décorateur apporte à la classe. Vous pouvez essayer quelque chose comme ceci:

function singleton<T>(constructor: new()=> T): T { 
    return new constructor() 
} 

export const SomeClass = singleton(class { 
    constructor() {} 

    public method(): string { 
     return 'Hello!' 
    } 
}); 

console.log(SomeClass.method())