Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类泛型类型的Typescript方法允许_Typescript_Typescript Typings_Typescript Generics - Fatal编程技术网

类泛型类型的Typescript方法允许

类泛型类型的Typescript方法允许,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,几乎有一个小的例外,我的约束似乎仍然允许任何。 谁能告诉我我错过了什么 用例: A类{ 公共b(){} 公共c:数字=0; 公共d:任何; }; 目前的执行情况: 类的函数方法< T扩展{new(…args:any[]):any;}&函数, M扩展(this:T,…args:any[])=>any={ [K in keyof T]:T[K]扩展(this:T,…args:any[])=>any ?T[K] :从不 }[keyof T] >(ctor:T,method:M,args?:参数):R

几乎有一个小的例外,我的约束似乎仍然允许任何。 谁能告诉我我错过了什么

用例:

A类{
公共b(){}
公共c:数字=0;
公共d:任何;
};
目前的执行情况:

类的函数方法< T扩展{new(…args:any[]):any;}&函数, M扩展(this:T,…args:any[])=>any={ [K in keyof T]:T[K]扩展(this:T,…args:any[])=>any ?T[K] :从不 }[keyof T] >(ctor:T,method:M,args?:参数):ReturnType{ 返回方法调用(ctor,args???[]); } const m0=类(A,A.prototype.b)的方法;//对的 常数m1=类的方法(A,A.prototype.c);//对的 常数m2=类(A,A.prototype.d)的方法;//不正确:-( 受这条线索的启发,我也管理了以下内容,但找不到合适的方法来使用它?

type方法=省略任何
从不
:K
}[keyof T]>;
类型M=方法;//正确
任何
都可以是
函数
any
可以是任何东西,包括
函数
。您的
类方法
函数无法知道您打算将
d
作为一个属性。将
d
作为一个函数完全可以

const a = new A();
a.d = () => "hello world"; // no error because `() => string` is assignable to `any`
换句话说,您看到的
m2
的结果是预期的行为,它不是“不正确的”。
any
意味着
d
可以是一个函数,可以用任何参数调用它。因此这也很好:

const m3 = methodOfClass(A, A.prototype.d, ["something", 999]);
显然,这样做有很大的潜在运行时错误

这里唯一的解决方案是不要在类属性上使用
any

不要让
args
成为可选参数 与
any
问题无关,我强烈建议您更改调用方法的方式,以避免运行时错误。如果函数需要参数,但您只使用默认的
[]
,那么您将遇到问题

(ctor: T, method: M, ...args: Parameters<M>): ReturnType<M> {
    return method.call(ctor, ...args);
}

any可分配给anythingas@RobertoZvjerković说,
any
可以是任何东西。它可以是一个方法,也可以是一个属性。因此这是预期的行为。在类的
方法中没有错误。唯一的“错误”在课堂上使用
any
!我完全同意使用any首先违背了创建类型的目的,是的。spread/rest确实更干净了,谢谢你和我一起思考。
class E {
    public e(n: number): number {
        return n + 1;
    }
};

const m0 = methodOfClass(A, A.prototype.b); // this is still the same
console.log(m0); // undefined

const m3 = methodOfClass(E, E.prototype.e, 6); // but here we need a `number`
console.log(m3); // 7

const m4 = methodOfClass(E, E.prototype.e); // error because args missing