TS中的条件类型(ReturnType)
本偏介绍TS另一种高级类型-条件类型。
官方文档:https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types
1、条件类型是一种由条件表达式所决定的类型
2、条件类型使类型具有了不唯一性,同样增加了语言的灵活性
例如:
T extends U ? X : Y
若类型T可被赋值给类型U,那么结果类型就是X类型,否则就是Y类型。
条件类型约束
泛型约束的例子:
type MessageOf<T extends { message: unknown }> = T["message"];
在此示例中,我们使用 message: unknown 约束泛型T。
如果我们想 MessageOf 支持任何类型,我们可以通过将约束和条件类型一起使用:
type MessageOf<T> = T extends { message: unknown } ? T["message"] : never;
如果条件成立,在 true 分支内,TypeScript 知道 T 将具有一个 message 属性。否则将会返回 never 类型。
分布条件类型
当条件类型给定联合类型时,它们将变为分布式。
type ToArray<Type> = Type extends any ? Type[] : never;
如果我们将联合类型传入ToArray,则条件类型将应用于该联合的每个成员。
type ToArray<Type> = Type extends any ? Type[] : never;type StrArrOrNumArr = ToArray<string | number>;
StrArrOrNumArr 类型是 string[] | number[]
避免这种分配性的行为。可以用方括号将 extends 关键字的每一侧括起来。
type ToArrayNonDist<Type> = [Type] extends [any] ? Type[] : never;type StrOrNumArr = ToArrayNonDist<string | number>;
StrArrOrNumArr 类型是 (string | number)[]
内置条件类型
预定义的有条件类型
TypeScript 2.8在lib.d.ts里增加了一些预定义的有条件类型:
Exclude<T, U> -- 从T中剔除可以赋值给U的类型。
Extract<T, U> -- 提取T中可以赋值给U的类型。
NonNullable<T> -- 从T中剔除null和undefined。
ReturnType<T> -- 获取函数返回值类型。
InstanceType<T> -- 获取构造函数类型的实例类型。
用法看这里:文档链接
type T00 = Exclude<"a" | "b" | "c" | "d", "a" | "c" | "f">; // "b" | "d"
type T01 = Extract<"a" | "b" | "c" | "d", "a" | "c" | "f">; // "a" | "c"type T02 = Exclude<string | number | (() => void), Function>; // string | number
type T03 = Extract<string | number | (() => void), Function>; // () => voidtype T04 = NonNullable<string | number | undefined>; // string | number
type T05 = NonNullable<(() => string) | string[] | null | undefined>; // (() => string) | string[]function f1(s: string) {return { a: 1, b: s };
}class C {x = 0;y = 0;
}type T10 = ReturnType<() => string>; // string
type T11 = ReturnType<(s: string) => void>; // void
type T12 = ReturnType<(<T>() => T)>; // {}
type T13 = ReturnType<(<T extends U, U extends number[]>() => T)>; // number[]
type T14 = ReturnType<typeof f1>; // { a: number, b: string }
type T15 = ReturnType<any>; // any
type T16 = ReturnType<never>; // any
type T17 = ReturnType<string>; // Error
type T18 = ReturnType<Function>; // Errortype T20 = InstanceType<typeof C>; // C
type T21 = InstanceType<any>; // any
type T22 = InstanceType<never>; // any
type T23 = InstanceType<string>; // Error
type T24 = InstanceType<Function>; // Error
重点:ReturnType:获取函数返回值的类型
function getUser() {return {name: 'xxx', age: 10}
}type GetUserType = typeof getUser;
type ReturnUser = ReturnType<GetUserType>
TypeScript提供了几种实用的内置工具类型,以方便进行常见的类型转换。官方链接:地址
Parameters:获取函数参数的类型
function getUser() {return {name: 'xxx', age: 10}
}type GetUserType = typeof getUser;
type ReturnUser = Parameters<GetUserType>
ConstructorParameters 获取构造函数的参数类型
class Person {name: string;constructor (name: string) {this.name = name}getName() {console.log(this.name)}
}
// 获取函数的参数类型
type Params = ConstructorParameters<typeof Person>
TS中的条件类型(ReturnType)相关推荐
- TS中的unknown类型
我们可以对 any 进行任何操作,不需要检查类型. let value:any; value = ture; value = 1; value.length; 没有类型检查就没有意义了,跟写 JS 一 ...
- ts中的never类型
定义一个类型type type A=number & string (&两个类型取交集) 简单结论:看到never就是ts代码写错了,要改
- TS中限制某种类型的传递
type NameType<T, A> = T extends A ? never : T;function name1<T>(x: NameType<T, number ...
- SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing)
SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing) 一,定价程序Pricing Procedure 所有定价中允许的条件类型都包含在定价程序中: ...
- Ionic3在ts中获取html中值的方法
我觉得有两种方法,都是Angular中的语法,一种是把值当做参数传递,另一种是使用ngModel实现双向绑定 还有一种很少用到的,Js的原生方法:document.getElementById('ch ...
- 在条件类型中使用 infer 关键字
在 TypeScript 中条件类型的用法是: T extends U ? X : Y 跟 JS 中的条件表达式一样,如果 extends 语句为真,则取X类型 ,反之得到Y类型 .我们这里把X称为条 ...
- SAP MM 条件类型中PB00的‘Group Cond.‘标记的作用?
SAP MM 条件类型中PB00的'Group Cond.'标记的作用? 如果没勾选这个标记,PO中的每个ITEM都根据其数量去取Scale里的价格, 而非PO汇总后的数量去取SCALE里的价格. 测 ...
- java中if(a.c())_if 语句中的条件语句只能是() 类型。_学小易找答案
[单选题]设 x,y 均为已定义的类名,下列声明对象 x1 的语句中正确的是 ( ) [单选题]C# 中引入命名空间使用 [简答题]class Parent{ private String name; ...
- 读懂 TS 中联合类型和交叉类型的含义
创建了一个 "重学TypeScript" 的微信群,想加群的小伙伴,加我微信 "semlinker",备注重学TS. 本文是 "重学TS系列" ...
最新文章
- UC伯克利发现「没有免费午餐定理」加强版:每个神经网络,都是一个高维向量...
- redis入门及java操作
- python【数据结构与算法】内置函数 zip() 函数(看不懂你来打我)
- 大端和小端,字节对齐
- 一道暴力枚举题Win32版本示例
- Redis - RedisTemplate及4种序列化方式深入解读
- SAP一句话入门:Human Resource
- matlab中tic,toc的用法
- WinForm中的各种对话框
- FaceBook机器学习开源DL模块
- Maven 在 mac os M1芯片 上的安装
- 2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...
- mysql叠加select,MySQL – 有效地将两个select语句组合成一个...
- HEVC学习 —— HM的使用
- python distance matrix_机器学习中的距离盘点
- 【设计配色宝典】设计师必备七色配色宝典,附AI源文件!
- 基于GIS技术的智慧城市数字底盘(时空大数据平台)
- java char类型 unicode字符集 utf-8字符编码
- 詹姆斯·高斯林接下来要做什么?
- 细胞分裂模拟(C++)
热门文章
- formdata格式
- 如何使用WordPress插件添加约会预约日历
- 防骗大数据,朋友圈里卖的这些东西...不是坑人就是害命!
- Python通过163和QQ收发邮件
- 家用PC机打造VSphere5.1 测试环境:之部署VCenter Server 5.1
- Faiss之PQ详解
- [九度][何海涛] 斐波那契数列
- 学习动力方法介绍,让你们成为永动机
- 段永平回应一切:从未遥控OV,黄峥不是弟子,靠营销不能持久
- python二元多次函数拟合_对python实现二维函数高次拟合的示例详解