有人可以解释一下我是如何在对象上创建“方法”的。
type GET_FUNCTION_SIGNATURE<
T extends TypedPropertyDescriptor<any>
> = T extends TypedPropertyDescriptor<infer U> ? U : never;
interface ITestDecoratorOptions<DECORATED_FUNCTION_ARGUMENTS_TYPE, DECORATED_FUNCTION_RETURN_TYPE> {
getKeyFromArgs: (args: DECORATED_FUNCTION_ARGUMENTS_TYPE) => string;
getDefaultValue: (args: DECORATED_FUNCTION_ARGUMENTS_TYPE) => DECORATED_FUNCTION_RETURN_TYPE;
}
const testDecorator = <TYPED_PROPERTY_DESCRIPTOR extends TypedPropertyDescriptor<any>>(
options: ITestDecoratorOptions<
Parameters<GET_FUNCTION_SIGNATURE<TYPED_PROPERTY_DESCRIPTOR>>,
ReturnType<GET_FUNCTION_SIGNATURE<TYPED_PROPERTY_DESCRIPTOR>>
>
) => {
return (
target: Object,
key: string,
descriptor = Object.getOwnPropertyDescriptor(target, key) as PropertyDescriptor
): TYPED_PROPERTY_DESCRIPTOR => {
return null as any;
};
};
class Test {
// \/ Is it possible to remove that generic and keep full type safety here?
@testDecorator<TypedPropertyDescriptor<(a: number, b: string) => boolean>>({
getKeyFromArgs: args => {
// number string
return args[0].toString() + args[1]; // full type checking
},
getDefaultValue: args => {
// full type checking: on args(number, string) and return type(boolean)
if (args[0] === 1) {
return true;
}
return false;
}
})
public someMethod(a: number, b: string): boolean {
return true;
}
}
答案 0 :(得分:3)
他们正在将键method
分配给一个函数-这就是一种方法。如果您想知道如何使用键method
,那是因为它不是JavaScript中的保留关键字。
实际方法使用提供的name
创建一个新方法,并将其设置为cb
。 (这也可以用于制作属性,而不仅仅是方法)。
var foo = {};
foo.method = function(name, cb) {
this[name] = cb;
};
foo.method("sayHello", () => console.log("Hello!"));
foo.sayHello();