重载的打字稿功能参数不适用于异步关键字

时间:2019-07-02 23:45:41

标签: javascript node.js typescript

我正在处理更大的项目类型定义文件。我已将代码简化为一个孤立的示例:

模块定义f.d.ts

export type myFunction = ((r: string) => Promise<any>) // async def
  | ((r: string, done: (err: Error | null, b?: any) => void) => void) //callback def

export interface addFunc {
  (c: string, f: myFunction): void
}

export interface FI {
  addFunc: addFunc
}

export default function f(): FI

模块实现f.js

function f () {
  return {
    addFunc: (c, p) => {
      this[c] = p
      return this
    }
  }
}

module.exports = f

模块利用率index.ts

import f from './f'

f().addFunc('x', (r, d) => { // Compiles as expected
  d(null)
})

f().addFunc('x', async (r) => { // Error ts(7006) Parameter 'r' implicitly has an 'any' type.
  return null
})

能否请您解释为什么会发生此错误以及如何解决?我认为问题出在类型定义中。

请不要对实现本身发表评论;这是大型API的精简和隔离部分。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您需要将其更改为

f().addFunc('x', async (r: string) => {
  return null
})

如果不添加: string,则您的函数实际上是(r: any) => Promise<null>,不能分配给类型myFunction

您的示例中的第一种情况得以编译,因为TypeScript能够通过存在两个参数的事实来推断rd的类型,这使得无法分配给第一种情况myFunction的并集定义中。但是,当一个函数只有一个参数时,可以将其分配给具有一个或多个参数的类型,因此TypeScript无法自动推断r的类型。