试图减少样板,我将某种通用函数接口声明为一种类型。然后,我想声明这种类型的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'
//}
答案 0 :(得分:12)
碰巧是函数的泛型和泛型类型之间有区别。
您定义的是一个泛型类型,即一个函数。这意味着我们可以将其分配给具有指定泛型类型的const:
type FunctionType<TValue> = (value: TValue) => void;
const bar: FunctionType<number> = (value) => { // value is number
}
要定义类型为通用函数,我们需要将type参数放在参数列表之前
type FunctionType = <TValue>(value: TValue) => void;
const bar: FunctionType = <TValue>(value) => { // generic function
}
答案 1 :(得分:0)
我一直在尝试解决相同的问题,特别是当我使用高阶函数(或React组件)返回其他通用函数(或组件)时,会发生此问题。我找到了以下解决方案:
interface GenericFunctionType {
<T>(x: T): string
}
const genericFunction: GenericFunctionType = (x) => `doSomething with X ${x}`