【发布时间】:2021-06-09 21:40:46
【问题描述】:
几乎有一个小例外,我的约束似乎仍然允许任何例外。 谁能告诉我我在这里缺少什么。
用例:
class A {
public b(){}
public c:number = 0;
public d:any;
};
当前实现:
function methodOfClass<
T extends { new (...args: any[]): any; } & Function,
M extends (this:T, ...args:any[]) => any = {
[K in keyof T]: T[K] extends (this:T, ...args:any[]) => any
? T[K]
: never
}[keyof T]
>(ctor:T, method:M, args?:Parameters<M>) : ReturnType<M> {
return method.call(ctor, args ?? []);
}
const m0 = methodOfClass(A, A.prototype.b); // correct
const m1 = methodOfClass(A, A.prototype.c); // correct
const m2 = methodOfClass(A, A.prototype.d); // incorrect :-(
受此线程的启发,我还管理了以下内容,但找不到合适的使用方法? How to create a type excluding instance methods from a class in typescript?
type Methods<T> = Omit<T, {
[K in keyof T]: T[K] extends (this:T, ...args:any[]) => any
? never
: K
}[keyof T]>;
type M = Methods<A>; // correct
【问题讨论】:
-
any 可以分配给任何东西
-
正如@RobertoZvjerković 所说,
any可以是任何东西。它可以是一种方法,也可以是一种属性。所以这是预期的行为。您的methodOfClass输入没有错误。唯一的“错误”是在课堂上使用any! -
我完全同意使用 any 违背了首先拥有类型的目的,是的。
标签: typescript typescript-typings typescript-generics