2016-04-03 3 views
2

Интересно, почему, когда я использую декораторы или аннотации в Typcript для класса. Компилятор не может вывести новый тип класса. Если я не использую декораторы и не использую старый способ сделать это в ES5 (т. Е. Вызвать вручную декоратор), то он, очевидно, работает.Typcript: Тип вывода при использовании декоратора

Например, вот пример, показывающий вопрос:

function decorate(Target: typeof Base): IExtendedBaseConstructor { 
    return class extends Target implements IExtendedBase { 
    public extendedtMethod(): number { 
     return 3; 
    } 
    }; 
} 

interface IBase { 
    baseMethod(): number; 
} 

interface IExtendedBase extends Base { 
    extendedtMethod(): number; 
} 

interface IExtendedBaseConstructor { 
    new(): IExtendedBase; 
} 

@decorate 
class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const test = new Base(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // NOT OK, typescript think, Base is still Base but we decorated it. 

С старшем Кстати, это работает:

class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const ExtendedBase = decorate(Base); 

const test = new ExtendedBase(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // OK 

Спасибо заранее.

+0

В чем преимущество этого шаблона? Разве это [этот код] (https://jsfiddle.net/pcyybdt7/1/) намного проще понять? –

+0

Вы правы. В этом случае этот шаблон бесполезен. Но новые интерфейсные рамки (например, angular2) решили использовать декоратор вместо наследования, чтобы объявить новые компоненты. – Cnode

+0

Я написал библиотеку, которая предлагает пользователю помощник для создания API класса (с некоторыми введенными в него параметрами и полезными методами). Поэтому я создал абстрактный класс Api, который предоставляет функциональные возможности и декоратор, который регистрирует api в моей структуре через «метаданные». В этом случае мой пользователь должен сделать: 'импорт {AbstractAPI, Api} от '' MYLIB @Api (...) класс UserApi расширяет AbstractAPI {}' Мой SO вопрос также связан с этим. Если бы я мог удалить расширения и объединить все в мой декоратор '@ Api', это уменьшило бы окончательную опечатку пользователя. – Cnode

ответ

2

Прямо сейчас это не работает. Существует pending issue на github, чтобы позволить декораторам класса изменять тип класса.

Я бы порекомендовал делать «старый способ», о котором вы говорили, пока это не будет реализовано.