TypeScript中`export const Field:<T> (x:T) => T;`语法如何解释?
代码含义解析
首先你贴的第一行代码export const Field:<T> (x:T) => T;本身不符合TypeScript语法,大概率是查看代码时漏看了等号,合法的写法应该是:
export const Field: <T>(x: T) => T;
这不是匿名类型定义,本质是给导出的常量Field做类型标注,标明它是一个泛型函数。
和泛型类型别名的核心差异
你提到的type myFunction<T> = (x: T) => T和上面的写法看起来相似,实际泛型绑定的层级完全不一样:
type myFunction<T> = (x: T) => T是泛型类型别名:泛型参数<T>定义在类型本身之上,使用这个类型的时候必须先确定T的具体类型,一旦指定就固定死了。比如:// 先指定T为string,得到一个固定的函数类型 const stringFunc: myFunction<string> = (x) => x.toUpperCase(); // 这里stringFunc只能接收string类型参数,不能传其他类型const Field: <T>(x: T) => T是泛型函数类型标注:泛型参数<T>定义在函数签名之上,不需要提前指定T的类型,在调用函数的时候TS会根据传入的参数自动推导T的类型,同一个函数可以适配多种类型的入参。
具体使用方法
这类写法一般分两步用:
- 先给常量标注泛型函数类型(就是你看到的声明语句)
- 给这个常量赋值符合类型签名的函数实现
示例代码:
// 声明:标明Field是一个入参类型和返回值类型一致的泛型函数 export const Field: <T>(x: T) => T; // 后续给它赋值实现 // 因为有类型标注,这里的入参x会自动推导为T类型,不需要额外写泛型 Field = (x) => x; // 调用时自动推导泛型类型 const numRes = Field(123); // T推导为number,numRes类型为number const strRes = Field("test"); // T推导为string,strRes类型为string const boolRes = Field(true); // T推导为boolean,boolRes类型为boolean
如果声明和赋值写在一起,代码可以简化成:
export const Field: <T>(x: T) => T = (x) => x;
内容的提问来源于stack exchange,提问作者Grobert
相关产品推荐
相关产品推荐

