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

时间:2020-02-10 13:11:05

标签: typescript

我有简单的函数,它以函数为参数并返回新函数。调用返回的函数时,我得到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'})

3 个答案:

答案 0 :(得分:1)

我们需要考虑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类型的第二个参数类型

答案 1 :(得分:1)

向调用函数添加一个类型,如下所示:

function(): Observable<any>

避免它返回unknown

答案 2 :(得分:-1)

为选项创建界面或使用 any 作为类型,

{{1}}

Typescript将选项类型设为{},这会导致在编译过程中出现问题。