首页 > 解决方案 > 打字稿泛型类型

问题描述

function identity<Type>(arg: Type): Type {
  return arg;
}
 
let myIdentity: <Input>(arg: Input) => Input = identity;

我从代码中了解到,“身份”函数采用泛型类型的参数。我不明白函数之后发生了什么。'myIndentity' 任务是如何工作的?

标签: typescripttypes

解决方案


所以,identity是一个泛型函数,当被调用时,必须用一个不受约束的类型参数 Type来指定;然后这个函数接受一个argtype的函数参数Type,并返回一个 type 的值Type

function identity<Type>(arg: Type): Type {
    return arg;
}

//IntelliSense says this:
//function identity<Type>(arg: Type): Type

您可以identity使用TypeScript 的typeof类型运算符(不要与JavaScript 的typeof运算符混淆)来获取类型:

type TypeofIdentity = typeof identity
// type TypeofIdentity = <Type>(arg: Type) => Type

Soidentity的类型可以写成泛型函数类型表达式 <Type>(arg: Type) => Type

请注意,这Type只是类型参数的名称,并且只是arg参数的名称,并且这些名称可以在不更改类型的情况下更改identity。这意味着以下内容与您拥有的版本完全等效:

type TypeofIdentity = <T>(x: T) => T

或这个:

type TypeofIdentity = <Input>(arg: Input) => Input

这意味着您的myIdentity变量已使用与 的类型完全等效的类型进行注释identity,并且您分配identitymyIdentity。SomyIdentity与 具有相同的值identity,并且您已将它们注释为相同的类型。

您可以通过声明var每种类型的 a 来向自己证明这一点;TypeScript 将允许您重新声明vars,但前提是后续声明的类型相同。以下编译的事实意味着编译器看不到 type of identity、 type ofmyIdentity或之间的重要区别<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

这意味着您可以使用与使用myIdentity相同的方式identity;毕竟,它们是同一回事:

const str = myIdentity("str");
// const str: "str"
const tru = myIdentity(true);
// const tru: true

Playground 代码链接


推荐阅读