Node.js 为什么Typescript不能推断出这种类型?

Node.js 为什么Typescript不能推断出这种类型?,node.js,generics,typescript,Node.js,Generics,Typescript,我正在尝试使用promisify的类型化版本,该方法将带有节点回调的函数转换为本机承诺,以便将它们与await async一起使用 其中一个类型签名如下所示: function promisify<A1, A2, R1>( nodeFunction: ( arg1: A1, arg2: A2, callback: (err: any, r1: R1) => any ) => any, arg1 : A1, arg2

我正在尝试使用promisify的类型化版本,该方法将带有节点回调的函数转换为本机承诺,以便将它们与await async一起使用

其中一个类型签名如下所示:

function promisify<A1, A2, R1>(
nodeFunction: (
      arg1: A1, 
      arg2: A2, 
      callback: (err: any, r1: R1) => any
      ) => any, 
arg1 : A1, 
arg2 : A2): Promise<R1> 
readfile签名:

readFile(filename: string, encoding: string, 
         callback: (err: NodeJS.ErrnoException, data: string) => void): void;
如果我们在函数调用中传递两个字符串,则是唯一在第二个参数上接受字符串的重载:

promisifyfs.readFile,'file.txt','utf8'

为什么编译器在第二个参数上选择接受对象而不是字符串的重载

由于arg2肯定是字符串“utf8”,编译器应该知道A2是字符串,然后只选择接受字符串作为第二个参数的重载

这些都是签名:

export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;
export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;

回调数据不是字符串。也从来没有。readFile为您提供了一个对象。如果我们从第1533行的definetly typed中读取节点类型,我们会看到我发布的签名。另外,节点readFile docs声明,只有在未指定encodingright的情况下,它才会为您提供缓冲区,但第二个可选参数要复杂得多。可能是这样。你是对的,但是因为只有一个重载接受字符串作为第二个参数,我希望编译器选择了那个参数,我更新了我的问题,解释了这个问题,没有详细说明,这可能有助于你调试它:可能只是一个不受支持的路径
export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void;
export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;
export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void;