对象是“未知”类型的打字稿泛型

新手上路,请多包涵

我有一个简单的函数,它接受一个函数作为参数并返回一个新函数。调用返回的函数时,我得到 Object is of type 'unknown'

 const makeFunction = <T>(callback: (someParam: number, options: T) => any) => {

  return (options: T) => {
    const param = 4;

    return callback(param, options)
  }
}

上面的代码对于打字稿是可以的,但是当我调用函数时,我得到了投诉

makeFunction((param, options) => {
  const a = options.optionsValue //(parameter) options: unknown,  Object is of type 'unknown'
})({optionsValue: 'some value'})

原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 594
2 个回答

我们需要思考 TS 如何从这个定义中推断出类型。 TS 可以从两个地方理解类型:

  • 显式泛型类型集
  • 函数第二个参数的类型

在您的用例中,您没有在任何这些地方提供类型,这就是您得到 unknown 的原因,因为 TS 如何知道您需要什么参数类型。为了让 TS 有可能了解您可以执行的类型,或者:

通过以下方式显式设置通用:

 makeFunction<YourType>((param, options) => {...))

通过例如预先定义一个回调函数来设置类型:

 const f = (a: number, b: {a: string}) => b // here types are set
makeFunction(f)({a: 'some value'}) // makeFunction is able to infer the types by f

您也可以通过说 ((param: number, options: MyType)) 来内联执行此操作

如果 options 可以是动态的,请在评论后回答

我相信你想要以下行为:

 const makeFunction = <F extends (someParam: number, options: any) => any>(callback: F) => {

  return (options: Parameters<F>[1]) => {
    const param = 4;

    return callback(param, options)
  }
}
const f = (a: number, b: {a: string}) => b
makeFunction(f)({ a: 'a' })
const g = (a: number, b: {b: number}) => b
makeFunction(g)({b: 1})

我们说几句:

  • F 现在是从二元函数扩展而来的函数,我们直接推断它的类型
  • Parameters<F>[1] 是给定函数的第二个参数类型 F 类型

原文由 Maciej Sikora 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在 try/catch 将 Typescript 升级到 4.4 版时遇到了这个问题,并在 文档 中找到了对此的解释。

在简历中,他们添加了标志 useUnknownInCatchVariables 如果 strict 默认情况下为真。它基本上将 catch 中的错误类型从 any 更改为 unknown 导致此问题。

因此,为了达到 4.4,您有一些选择:

 try {
    ...
} catch(e) {
    console.log((e as Error).message)
}

或者:

 try {
    ...
} catch(e) {
    if (e instanceof Error) {
        console.log(e.message)
    }
}

或在您的 tsconfig.json 您可以将标志显式设置为 false

 {
    "compilerOptions": {
        "strict": true,
        "useUnknownInCatchVariables": false
    }
}

原文由 Milton Castro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进