给出以下Angular组件:
export class NumberComponent implements NumberInterface {
@Input() number;
constructor() { }
}
现在我期待实施NumberInterface
。这是我到目前为止所得到的:
export interface NumberInterface {
number: number
}
基本上,我使用类型Function
来定义装饰器。现在我想知道是否有更具体的方法来做到这一点。界面应该强制组件实现角度@Input
装饰器。
答案 0 :(得分:6)
Typescript中的接口严格没有值,因为它们是仅存在于类型检查中的实体,并且不会编译为JS。
您无法在界面中定义装饰器,因为装饰器具有值。它是一个接受参数并为类属性赋值的函数,而不是类型。
Angular的@Input
装饰器本身确实有输入,但是在低级类中输入它们是不可能的,因为该属性本身已经是一个类型,但装饰者给出了 value :
export interface ITest {
prop: Input;
prop2: InputDecorator;
}
export class Test implements ITest {
@Input('thing') prop: string;
@Input('thing2') prop2: string;
}
// typeerror: Test does not correctly implement ITest
但是,组件类可以从Angular派生,父类的装饰器将由子项继承。如果您希望实现强类型以及更加多态的代码方法,这将非常有用:
export class NumberBase {
@Input('number') number: number;
}
export class NumberComponent extends NumberBase {
ngOnInit() {
console.log(this.number); // works!
}
}
组件可以扩展普通TS类或完全装饰的Angular组件。