Интересно, почему, когда я использую декораторы или аннотации в 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
Спасибо заранее.
В чем преимущество этого шаблона? Разве это [этот код] (https://jsfiddle.net/pcyybdt7/1/) намного проще понять? –
Вы правы. В этом случае этот шаблон бесполезен. Но новые интерфейсные рамки (например, angular2) решили использовать декоратор вместо наследования, чтобы объявить новые компоненты. – Cnode
Я написал библиотеку, которая предлагает пользователю помощник для создания API класса (с некоторыми введенными в него параметрами и полезными методами). Поэтому я создал абстрактный класс Api, который предоставляет функциональные возможности и декоратор, который регистрирует api в моей структуре через «метаданные». В этом случае мой пользователь должен сделать: 'импорт {AbstractAPI, Api} от '' MYLIB @Api (...) класс UserApi расширяет AbstractAPI {}' Мой SO вопрос также связан с этим. Если бы я мог удалить расширения и объединить все в мой декоратор '@ Api', это уменьшило бы окончательную опечатку пользователя. – Cnode