TS中的条件类型(ReturnType)

简介: 本偏介绍TS另一种高级类型-条件类型

本偏介绍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>;  // () => void

type 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>;  // Error

type 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>
相关文章
|
JavaScript
ts常用的语法
ts常用的语法
|
5月前
|
JavaScript
|
6月前
|
JavaScript 编译器 开发者
TS类型断言
TS类型断言
47 0
|
11月前
|
JavaScript
ts中枚举
ts中枚举
53 0
|
JavaScript 前端开发
ts -函数的类型
在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression)
|
JavaScript 编译器 开发者
ts的接口是什么有什么作用
ts的接口是什么有什么作用
365 0
【TS】枚举
【TS】枚举
70 0
【TS】函数和函数类型
【TS】函数和函数类型
80 0
|
JavaScript
【TS】ts的使用和类型注解
【TS】ts的使用和类型注解
133 0