【问题标题】:Typescript generic type打字稿泛型类型
【发布时间】:2021-11-26 17:35:58
【问题描述】:
function identity<Type>(arg: Type): Type {
  return arg;
}
 
let myIdentity: <Input>(arg: Input) => Input = identity;

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

【问题讨论】:

  • identitymyIdentity 是等效的函数,只是使用不同的语法。

标签: typescript types


【解决方案1】:

所以,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&lt;Type&gt;(arg: Type) =&gt; Type

注意Type只是一个类型参数的namearg只是一个参数的name,这些名字可以在不改变的情况下改变identity类型。这意味着以下内容与您拥有的版本完全等效:

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

或者这个:

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

这意味着您的myIdentity 变量已经是annotated,其类型完全等同于identity,并且您将identity 分配给myIdentity。所以myIdentityidentity 的值是一样的,你已经把它们标注为相同的类型了。

您可以通过声明每种类型的var 来证明这一点; TypeScript 将允许您重新声明 vars,但前提是后续声明的类型相同。以下编译的事实意味着编译器认为identity 的类型、myIdentity 的类型或&lt;T&gt;(x: T)=&gt;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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2018-04-27
    • 2020-05-09
    • 2017-09-15
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多