所以,identity 是一个 generic 函数,在调用它时,必须使用单个不受约束的类型参数 Type 指定;然后这个函数接受一个Type类型的函数参数arg,并返回一个Type类型的值:
function identity<Type>(arg: Type): Type {
return arg;
}
//IntelliSense says this:
//function identity<Type>(arg: Type): Type
您可以使用TypeScript's typeof type operator 获取identity 的类型(不要与JavaScript's typeof operator 混淆):
type TypeofIdentity = typeof identity
// type TypeofIdentity = <Type>(arg: Type) => Type
所以identity的类型可以写成泛型function type expression<Type>(arg: Type) => Type。
注意Type只是一个类型参数的name,arg只是一个参数的name,这些名字可以在不改变的情况下改变identity 的类型。这意味着以下内容与您拥有的版本完全等效:
type TypeofIdentity = <T>(x: T) => T
或者这个:
type TypeofIdentity = <Input>(arg: Input) => Input
这意味着您的myIdentity 变量已经是annotated,其类型完全等同于identity,并且您将identity 分配给myIdentity。所以myIdentity 和identity 的值是一样的,你已经把它们标注为相同的类型了。
您可以通过声明每种类型的var 来证明这一点; TypeScript 将允许您重新声明 vars,但前提是后续声明的类型相同。以下编译的事实意味着编译器认为identity 的类型、myIdentity 的类型或<T>(x: T)=>T 的类型之间没有重要区别:
var x: typeof identity;
var x: typeof myIdentity; // okay
var x: <T>(x: T) => T; // okay
无论如何,从根本上说,您所做的就是创建一个值,然后将该值分配给相同类型的新变量。从某种意义上说,它与:
const date = new Date(); // make a thing
let myDate: Date = date; // assign thing to another variable
这意味着您可以像使用identity 一样使用myIdentity;毕竟它们是同一回事:
const str = myIdentity("str");
// const str: "str"
const tru = myIdentity(true);
// const tru: true
Playground link to code