以下代码取自角度源代码di.ts
。
export interface AttributeDecorator {
(name: string): any;
new (name: string): Attribute;
}
我知道这是一个界面。但是new (name: string): Attribute
正在做什么以及为什么有两种类型的名称string and any
。
上面的代码后跟
export interface Attribute { attributeName?: string; }
export const Attribute: AttributeDecorator = makeParamDecorator('Attribute', (attributeName?: string) => ({attributeName}));
答案 0 :(得分:2)
(name: string): any
表示实现此接口的函数应该被称为常规函数;它使用name
字符串参数调用并返回any
。
new (name: string): Attribute
表示实现此接口的函数应该用作构造函数,使用new
调用并返回Attribute
对象。
这个装饰器接口描述了Angular装饰器函数可以同时用作@Attribute(...)
parameter decorator函数和new Attribute(...)
构造函数的事实,并且在被调用时它们的行为也不同。
new Attribute(...)
可用于ES5和ES6中的注释,如this answer所示。
此接口描述并由makeParamDecorator
工厂创建的函数应该大致类似于:
// decorator factory
const MyAttributeDecorator = function (attributeName?: string) {
if (new.target)
// Attribute object
return { attributeName };
else
// parameter decorator
return (target, prop, paramIndex) => { ... };
}