typescript - 打字稿泛型类型
问题描述
function identity<Type>(arg: Type): Type {
return arg;
}
let myIdentity: <Input>(arg: Input) => Input = identity;
我从代码中了解到,“身份”函数采用泛型类型的参数。我不明白函数之后发生了什么。'myIndentity' 任务是如何工作的?
解决方案
所以,identity
是一个泛型函数,当被调用时,必须用一个不受约束的类型参数 Type
来指定;然后这个函数接受一个arg
type的函数参数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
,并且您分配identity
给myIdentity
。SomyIdentity
与 具有相同的值identity
,并且您已将它们注释为相同的类型。
您可以通过声明var
每种类型的 a 来向自己证明这一点;TypeScript 将允许您重新声明var
s,但前提是后续声明的类型相同。以下编译的事实意味着编译器看不到 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
推荐阅读
- git - 将“子”git repo 合并/移动到“父”git repo
- python - 操作两个数据帧以到达输出
- macos - sbt - Scala - Brew - MacOS - 根本无法连接到 sbt shell:NoClassDefFoundError
- javascript - 如何解决 Vetur/Vuelidate 错误“'验证'在'ComponentOptions 类型中不存在'
问题:如何
'validations' does not exist in type 'ComponentOptions<Vue [etc.]
在 VSCode 中使用 Vetur 并安装 Typescript 时解决错误?- php - Stripe - 支付订单错误:无法向没有活动卡的客户收费
- python - 使用 3D 样本数据比较 K-Means 和 MiniBatchKMeans 聚类算法
- javascript - 使用 styled-components 从父组件设置子组件的样式
- r - 使用 rvest 抓取可折叠表的问题
- sql - 如何在查询的同一个where子句中使用函数返回值?
- sql - 需要帮助来简化此 T-SQL 查询