声明泛型类型的const

ide*_*tia 8 types typescript

试图减少样板,我将某种泛型函数接口声明为一种类型.然后我想宣布一个const这样的类型.那么,为什么打字稿假定foo声明是合法的而bar不是?这些声明几乎不相同吗?打字稿缺乏简单的功能还是我错过了一些细节?是否有任何变通方法,如果我不想明确重复FunctionType界面?

type FunctionType<TValue> = (value: TValue) => void;

const foo = <TValue>(value: TValue): void => {
}

//const bar: FunctionType<TValue> = (value) => { // Cannot find name 'TValue'
//}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 17

作为函数的泛型类型和作为泛型函数的类型之间存在差异.

您定义的是一个泛型类型,它是一个函数.这意味着我们可以将其分配给具有指定泛型类型的consts:

type FunctionType<TValue> = (value: TValue) => void;
const bar: FunctionType<number> = (value) => { // value is number
}
Run Code Online (Sandbox Code Playgroud)

要定义作为泛型函数的类型,我们需要将type参数放在参数列表之前

type FunctionType = <TValue>(value: TValue) => void;
const bar: FunctionType = <TValue>(value) => { // generic function
}
Run Code Online (Sandbox Code Playgroud)


Hys*_*ter 10

我一直在尝试解决同样的问题,尤其是当我使用高阶函数(或 React 组件)返回其他通用函数(或组件)时会发生这种情况。我找到了以下解决方案:

interface GenericFunctionType {
    <T>(x: T): string
}

const genericFunction: GenericFunctionType = (x) => `doSomething with X ${x}`
Run Code Online (Sandbox Code Playgroud)