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>
相关文章
|
5月前
|
传感器 自然语言处理 搜索推荐
通义灵码 2.5 版体验报告:智能编程助手的全新升级
通义灵码2.5版通过Qwen3模型和智能体模式,显著提升了编程效率与体验。智能体可自主决策,快速完成应用开发;MCP工具广场提供3000+工具,一键安装便捷高效;记忆能力让工具越用越懂用户需求;Qwen3强大的自然语言处理能力助力复杂任务解析。界面友好、性能稳定,为开发者带来高效个性化体验,未来潜力巨大。
189 16
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何创建mysql临时表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
IDE 测试技术 开发工具
Xcode 16.4 (16F6) 发布 - Apple 平台 IDE
Xcode 16.4 (16F6) 发布 - Apple 平台 IDE
380 1
Xcode 16.4 (16F6) 发布 - Apple 平台 IDE
|
监控 安全 网络安全
智能合约的安全审计与风险评估:技术解析与应对策略
【8月更文挑战第4天】智能合约的安全审计与风险评估是保障区块链应用安全的重要环节。通过严格的代码审查、使用安全编程规范、实施权限控制以及监控和应急响应等措施,可以有效降低智能合约的安全风险。未来,随着区块链技术的不断发展和智能合约的广泛应用,对智能合约的安全审计与风险评估也将变得更加重要和复杂。因此,我们需要持续关注智能合约的安全问题,并不断探索新的安全技术和方法。
|
JavaScript 编译器
vue3+ts:shims-vue.d.ts
vue3+ts:shims-vue.d.ts
496 0
vue3+ts:shims-vue.d.ts
|
JavaScript 前端开发 编译器
TypeScript中的高级类型:联合类型、交叉类型与条件类型深入解析
【4月更文挑战第23天】探索TypeScript的高级类型。这些特性增强类型系统的灵活性,提升代码质量和维护性。
|
11月前
|
存储 JavaScript 前端开发
decimal.js库的安装和使用方法
【10月更文挑战第24天】decimal.js 是一个非常实用的高精度计算库,通过合理的安装和使用,可以在 JavaScript 中实现精确的数值计算和处理。你可以根据具体的需求和项目情况,灵活运用该库来解决数字精度丢失的问题。
|
JavaScript 前端开发
HTML 表单和输入与按钮的联动方法汇总
在HTML中,通过JavaScript可以轻松实现表单与输入、按钮的互动。本文介绍了基本表单结构,并展示了如何用JS处理按钮点击、表单提交、动态禁用按钮、表单验证以及使用AJAX和jQuery简化代码等技巧,帮助你更好地控制和优化表单功能。
|
分布式计算 并行计算 负载均衡
并行计算与NumPy:加速数据处理的新途径
【4月更文挑战第17天】本文探讨了使用NumPy结合并行计算加速数据处理的方法。并行计算通过利用多个处理单元提高处理大规模数据的效率,而NumPy虽不直接支持并行计算,但可与OpenMP、Cython或Dask等工具结合。OpenMP能并行化NumPy函数,Dask则用于分布式并行计算。同时,文中提醒注意数据划分、通信开销、并行化策略及负载均衡等问题。随着技术发展,未来并行计算将在数据处理领域发挥更大作用。
|
小程序 开发者
【微信小程序】-- 分包 - 独立分包 & 分包预下载(四十五)
【微信小程序】-- 分包 - 独立分包 & 分包预下载(四十五)
15281 0