本偏介绍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)相关推荐

  1. TS中的unknown类型

    我们可以对 any 进行任何操作,不需要检查类型. let value:any; value = ture; value = 1; value.length; 没有类型检查就没有意义了,跟写 JS 一 ...

  2. ts中的never类型

    定义一个类型type type A=number & string (&两个类型取交集) 简单结论:看到never就是ts代码写错了,要改

  3. TS中限制某种类型的传递

    type NameType<T, A> = T extends A ? never : T;function name1<T>(x: NameType<T, number ...

  4. SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing)

    SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing) 一,定价程序Pricing Procedure 所有定价中允许的条件类型都包含在定价程序中: ...

  5. Ionic3在ts中获取html中值的方法

    我觉得有两种方法,都是Angular中的语法,一种是把值当做参数传递,另一种是使用ngModel实现双向绑定 还有一种很少用到的,Js的原生方法:document.getElementById('ch ...

  6. 在条件类型中使用 infer 关键字

    在 TypeScript 中条件类型的用法是: T extends U ? X : Y 跟 JS 中的条件表达式一样,如果 extends 语句为真,则取X类型 ,反之得到Y类型 .我们这里把X称为条 ...

  7. SAP MM 条件类型中PB00的‘Group Cond.‘标记的作用?

    SAP MM 条件类型中PB00的'Group Cond.'标记的作用? 如果没勾选这个标记,PO中的每个ITEM都根据其数量去取Scale里的价格, 而非PO汇总后的数量去取SCALE里的价格. 测 ...

  8. java中if(a.c())_if 语句中的条件语句只能是() 类型。_学小易找答案

    [单选题]设 x,y 均为已定义的类名,下列声明对象 x1 的语句中正确的是 ( ) [单选题]C# 中引入命名空间使用 [简答题]class Parent{ private String name; ...

  9. 读懂 TS 中联合类型和交叉类型的含义

    创建了一个 "重学TypeScript" 的微信群,想加群的小伙伴,加我微信 "semlinker",备注重学TS. 本文是 "重学TS系列" ...

最新文章

  1. UC伯克利发现「没有免费午餐定理」加强版:每个神经网络,都是一个高维向量...
  2. redis入门及java操作
  3. python【数据结构与算法】内置函数 zip() 函数(看不懂你来打我)
  4. 大端和小端,字节对齐
  5. 一道暴力枚举题Win32版本示例
  6. Redis - RedisTemplate及4种序列化方式深入解读
  7. SAP一句话入门:Human Resource
  8. matlab中tic,toc的用法
  9. WinForm中的各种对话框
  10. FaceBook机器学习开源DL模块
  11. Maven 在 mac os M1芯片 上的安装
  12. 2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...
  13. mysql叠加select,MySQL – 有效地将两个select语句组合成一个...
  14. HEVC学习 —— HM的使用
  15. python distance matrix_机器学习中的距离盘点
  16. 【设计配色宝典】设计师必备七色配色宝典,附AI源文件!
  17. 基于GIS技术的智慧城市数字底盘(时空大数据平台)
  18. java char类型 unicode字符集 utf-8字符编码
  19. 詹姆斯·高斯林接下来要做什么?
  20. 细胞分裂模拟(C++)

热门文章

  1. formdata格式
  2. 如何使用WordPress插件添加约会预约日历
  3. 防骗大数据,朋友圈里卖的这些东西...不是坑人就是害命!
  4. Python通过163和QQ收发邮件
  5. 家用PC机打造VSphere5.1 测试环境:之部署VCenter Server 5.1
  6. Faiss之PQ详解
  7. [九度][何海涛] 斐波那契数列
  8. 学习动力方法介绍,让你们成为永动机
  9. 段永平回应一切:从未遥控OV,黄峥不是弟子,靠营销不能持久
  10. python二元多次函数拟合_对python实现二维函数高次拟合的示例详解