我有简单的函数,它以函数为参数并返回新函数。调用返回的函数时,我得到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'})
答案 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将选项类型设为{},这会导致在编译过程中出现问题。