typescript type 分配条件类型示例详解

 更新时间:2023年08月18日 11:16:47   作者:goblin_pitcher  
这篇文章主要为大家介绍了typescript type 分配条件类型示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

接上文type challenge(easy部分)关于分配条件类型,官方文档描述地址

之前看的时候没真正理解,关于联合类型的分配条件,官方文档其实也没有讲得很明白,和翻译无关,英文文档一样很模糊,这些天做type challenge,发现有些题做出来的结果和预期不太一致,所以重新梳理这块内容。

先说结论

联合类型什么时候会分配,必须符合4个条件(后面直接用条件1、条件2等代指下面条件):

首先,只分配extends前的内容

  • 无论这个extends是不是子断言语句中的
  • 例如type Test<T> = 'b' extends 'b' ? (T extends 'b' ? true: false) : false;, 其中的T extends 'b'在子语句中,但事实上依旧是有效的

分配的内容未做任何处理

  • type Test<T> = keyof T extends null ? never: false;Tkeyof操作符处理了,因此不会分配
  • 官方文档中,提到避免分配的方法type ToArrayNonDist<Type> = [Type] extends [any] ? Type[] : never;,能规避分配也是这个道理

分配内容必须作为参数传入

传入时是联合类型

题目解析

验证条件

条件1

type Test<T> = 'b' extends 'b' ? (T extends 'b' ? true: false) : false;
Test<'a'| 'b'> // boolean

可见在子条件中的extends也符合自动分配,否则'a'|'b' extends 'b'会返回false,而不是true|false

条件2

发现这个问题是在DeepReadonly,题目地址

这一题一看看过去,直接写出如下:

type DeepReadonly&lt;T&gt; = keyof T extends never ? T : {readonly [k in keyof T]: DeepReadonly&lt;T[k]&gt;};

但是发现对于测试用例X2不生效

type X2 = { a: string } | { b: number };
DeepReadonly&lt;X2&gt; // { a: string } | { b: number }

仔细看,虽然X2是联合类型,但keyof T extends never显然不符合前面说的条件2,因此不会自动分配,而keyof ({ a: string } | { b: number })值为never。因此该题正确写法如下:

type DeepReadonly<T> = {
  readonly [P in keyof T]: keyof T[P] extends never ? T[P] : DeepReadonly<T[P]>;
};

条件3

显然,普通使用extands不会触发自动分配

type Test = 'a'|'b' extends 'a' ? true: false; // false

那么,假设传入的参数是联合类型,extends前的对象也是联合类型呢?

type Test<T> = 'b' extends 'b' ? (keyof T extends 'b' ? true: false) : false;
type Result = Test<{a:1,b:string}|{a:2,b:number}> // false

这里,参数T是联合类型,但extends前进行了keyof处理,但keyof {a:1,b:string}|{a:2,b:number}结果为'a'|'b',依然是联合类型,若这里进行了自动分配,结果应是boolean而非false

根据结果来看,这里并未进行分配,这个例子同时违背了条件2条件3

条件4

type Test<T> = 'a'|'b' extends 'b' ? T: false;
Test<5> // false

条件4显而易见,官方文档上已经说的很明确了。

不注意优先级导致的错误

在测试分配条件类型的规律时,曾因为一条用例卡了半天,用例如下:

type A = keyof null|undefined; // undefined
type UndefinedExtendsNull = undefined extends null ? true: false; //false
type Test<T> = keyof T extends null ? true: false;
Test<null|undefined>; // true !!!!

此时已经知道了,keyof T会避免自动分配,因此对于Test<null|undefined>,可以写成

keyof null|undefined extends null ? true : false; // 这里有个坑...

keyof null|undefined结果是undefined,但是

type UndefinedExtendsNull = undefined extends null ? true: false; //false

结果是false,同样的式子,结果不一样,一开始我以为是分配规律的理解有问题,但即使分配了,结果也应该是true|false,也就是boolean,而不是true

后来发现,type是有优先级的,且keyof优先级高于|.

按理说keyof null|undefined结果应该是never,之所以会显示结果是undefined,是因为优先级运算:

keyof null|undefined -> (keyof null)|undefined -> never|undefined -> undefined

在实际写类型的时候,要重点注意优先级问题

以上就是typescript type 分配条件类型示例详解的详细内容,更多关于typescript type分配条件类型的资料请关注脚本之家其它相关文章!

相关文章

  • TypeScript数据结构栈结构Stack教程示例

    TypeScript数据结构栈结构Stack教程示例

    这篇文章主要为大家介绍了TypeScript数据结构栈结构Stack教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • js 获取今天以及过去日期

    js 获取今天以及过去日期

    这篇文章主要介绍了js获得当前系统日期时间以及过去系统日期时间的方法,涉及javascript操作日期时间的相关技巧,示例代码如下,需要的朋友可以参考下
    2017-04-04
  • TypeScript数据结构之队列结构Queue教程示例

    TypeScript数据结构之队列结构Queue教程示例

    这篇文章主要为大家介绍了TypeScript数据结构之队列结构Queue教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • postman数据加解密实现APP登入接口模拟请求

    postman数据加解密实现APP登入接口模拟请求

    对于Postman的使用,一般情况下只要发发确定的请求与参数就可以的了,然而,在使用的时候,尤其是接口测试时,请求接口的设计里面都有数据加密,参数验签,返回数据也有进行加密的,这个时候就需要使用一些脚本做处理,模拟app登入请求的操作
    2021-08-08
  • typescript type类型使用梳理总结

    typescript type类型使用梳理总结

    这篇文章主要为大家介绍了typescript type类型使用梳理总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • TypeScript逆变之条件推断和泛型的应用示例详解

    TypeScript逆变之条件推断和泛型的应用示例详解

    这篇文章主要为大家介绍了TypeScript逆变之条件推断和泛型的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • typescript快速上手的进阶类型与技术

    typescript快速上手的进阶类型与技术

    本文讲述了typescript开发的一些高级的类型与技术,算是对于基础知识点的补充,具体内容包括:比如元组、枚举类、接口、泛型相关概念等。虽说是进阶,但是内容不算多也并不难理解。
    2022-12-12
  • CKEditor4配置与开发详细中文说明文档

    CKEditor4配置与开发详细中文说明文档

    网上分享的CKEditor4中文说明很多都只是的部分使用方法,今天为大家分享一下比较完整的CKEditor4中文说明文档
    2018-10-10
  • TypeScript实现十大排序算法之冒泡排序示例详解

    TypeScript实现十大排序算法之冒泡排序示例详解

    这篇文章主要为大家介绍了TypeScript实现十大排序算法之冒泡排序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • type-challenge刷题(easy部分)示例详解

    type-challenge刷题(easy部分)示例详解

    这篇文章主要为大家介绍了type-challenge刷题(easy部分)示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论