Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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 TS如何选择错误的方法签名?_Typescript_Visual Studio Code - Fatal编程技术网

Typescript TS如何选择错误的方法签名?

Typescript TS如何选择错误的方法签名?,typescript,visual-studio-code,Typescript,Visual Studio Code,我正在使用sequelize类型脚本,它是一个围绕sequelize的TS包装器,一个JS ORM 其中有以下声明: public static findOne<M extends Model>(this: { new (): M } & typeof Model, options?: FindOptions): Promise<M | null>; public static findOne<M extends Model>(this: { new

我正在使用
sequelize类型脚本
,它是一个围绕sequelize的TS包装器,一个JS ORM

其中有以下声明:

public static findOne<M extends Model>(this: { new (): M } & typeof Model, options?: FindOptions): Promise<M | null>;
public static findOne<M extends Model>(this: { new (): M } & typeof Model, options: NonNullFindOptions): Promise<M>;
为了让编译器选择正确的类型检查,它遵循与底层JavaScript类似的过程。它查看重载列表,并继续执行第一个重载,尝试使用提供的参数调用函数。如果找到匹配项,它将选择此重载作为正确的重载。出于这个原因,通常会将重载从最特定的顺序排列到最不特定的顺序

NonNullFindOptions
满足
FindOptions
,因此Typescript能够使用
NonNullFindOptions
调用第一个方法,并因此选择它作为匹配签名。颠倒方法的声明顺序可以解决此问题:

class Dummy {
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options: NonNullFindOptions): Promise<M>;
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options?: FindOptions): Promise<M | null>;
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options: FindOptions | NonNullFindOptions): Promise<M> | Promise<M | null> {
    return Promise.resolve({} as M);
  }
}
类虚拟{
公共静态findOne(this:{new():M}&typeof模型,选项:NonNullFindOptions):Promise;
公共静态findOne(this:{new():M}&typeof模型,options?:FindOptions):Promise;
公共静态findOne(this:{new():M}&typeof模型,选项:FindOptions | NonNullFindOptions):Promise | Promise{
返回承诺。解析({}为M);
}
}

太棒了!我可以确认更改订单会有所帮助。然而,为什么
foo
起作用呢?显式文字和具有相同值和类型的变量之间有什么区别?我已经创建了,以防行为上的差异是一个bug。我不确定为什么
foo
有效。如果将文字参数拉入变量或添加类型转换,Typescript会对此进行抱怨。结果证明,它起了作用。在选择方法签名时,文字对象不能向上转换,而非文字对象可以并且将要向上转换。
class Dummy {
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options: NonNullFindOptions): Promise<M>;
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options?: FindOptions): Promise<M | null>;
  public static findOne<M extends Model>(this: { new(): M } & typeof Model, options: FindOptions | NonNullFindOptions): Promise<M> | Promise<M | null> {
    return Promise.resolve({} as M);
  }
}