具有泛型的函数在其他函数中用作参数

时间:2020-02-28 18:09:52

标签: typescript typescript-typings typescript-generics

假设我定义了一个CoolType类型,如下所示:

type CoolType<T> = {message: string, result: T} 

然后,我定义一个CoolFunction类型来描述一个返回CoolType的函数:

type CoolFunction = <T>() => CoolType<T>

CoolFunction是第二个函数期望的参数类型:

function superCoolFunction(coolFunction: CoolFunction) {
    return coolFunction()
}

最终,在所有这些定义之后,我尝试运行如下代码:

const res = superCoolFunction(<string>() => {
    return {message: 'I am the message', result: 'I am the result'}
})

但是,在以上代码的<string>() => {中,我从编译器中收到一条错误消息,告诉我

ts <6133)声明为

'string',但其值永远不会被读取。 输入'()=> {message:string;结果:字符串; }' 不是 可分配给“ CoolFunction”类型的参数。通话签名 返回类型'{message:string;结果:字符串; }”和“ CoolType” 不兼容。 这些类型之间的“结果”类型不兼容。 类型“字符串”不可分配给类型“ T”。 'string'可以分配给'T'类型的约束,但是'T'可以用不同的约束子类型实例化 '{}'。ts(2345)

知道我在做什么错吗?这是stackblitz,它再现了错误。

1 个答案:

答案 0 :(得分:2)

您似乎在错误的位置使用了泛型。我认为您想要的是:

type CoolFunction<T> = () => CoolType<T>;

CoolFunction也采用通用类型。然后,您的高阶函数可以传播泛型:

function superCoolFunction<T>(coolFunction: CoolFunction<T>): CoolType<T> {
    return coolFunction();
}

现在,特定类型可以由编译器推断:

superCoolFunction(() => ({ message: 'foo', result: 123 }));
// function superCoolFunction<number>(coolFunction: CoolFunction<number>): CoolType<number>

或明确提供:

superCoolFunction<string>(() => ({ message: 'foo', result: 'bar' }));