美文网首页
TS的元组、枚举和联合

TS的元组、枚举和联合

作者: 绝尘kinoko | 来源:发表于2022-05-07 15:42 被阅读0次

标题中几个概念都是TS类型应用中非常好用的,类型应用好处很多,在此不细谈,主要讲讲元组等具体使用。基本概念不涉及,有一定阅读门槛。
元组

let x: [string, number];
x = ['1', 2];
// 限定顺序
// x = [1, '2'] error

元组转联合 Tuple[number]技巧

type Tuple = [string, number, boolean];
type Union = Tuple[number]; // string | number | boolean

泛型转Utility Types Tuple2Union类比Partial

type Tuple2Union<T extends readonly unknown[]> = T[number];
type Tuple2 = [string, number, boolean];
type Union2 = Tuple2Union<Tuple2>; // string | number | boolean

元组转mapType

type Tuple3 = ['blue', 'yellow', 'red'];
type MappedTuple = {
    [k in Tuple3[number]]: string;
};
type MappedTuple = {
    blue: string;
    yellow: string;
    red: string;
}

extends ele extands arr

type Includes1<T extends readonly any[], P> = P extends T[number] ? true : false;
type Includes2<T extends readonly any[], P> = T[number] extends P ? true : false;
type isPillarMen = Includes1<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Wamuu'>; // true
type isPillarMen2 = Includes2<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Wamuu'>; // false

枚举
可以用数字枚举和字符串枚举 但是不要用混合枚举

enum Color {
    Red,
    Greeen,
    Blue
}
// 编译为js相当于
let jsColor = { '0': 'Red', '1': 'Greeen', '2': 'Blue', Red: 0, Greeen: 1, Blue: 2 };
let c1: Color = Color.Blue; // 可以当对象用
enum CardinalDirection {
    North = 'N',
    East = 'E',
    South = 'S',
    West = 'W'
}
// 编译后为
let jsCD = { North: 'N', East: 'E', South: 'S', West: 'W' };

数字枚举和字符串枚举的区别就在这里

loose type-checking 弱类型校验

const color1: Color = 4; // 超过枚举范围,不会报错
const color2: Color.Red = 5; // 虽然类型声明比较奇怪,但是不会报错
// const color3: Color ='6' // Error
// let cd1: CardinalDirection = 'N' // Error

所以用枚举尽量使用字符串枚举,或者是赋值使用如下写法

const c2: Color = Color.Red;
if (c2 === Color.Red) {
}

枚举转mapType

type ColorMap = {
    [key in Color]: string;
};
type ColorMap = {
    0: string;
    1: string;
    2: string;
}

常数枚举

const enum Direction {
    Up,
    Down,
    Left,
    Right
}
// 编译后为
const jsDir = { Up: 0, Down: 1, Left: 2, Right: 3 }; // 没有数字当key的了
let directions = [Direction.Up, Direction.Down, Direction.Left, Direction.Right]; // [0, 1, 2, 3]

声明枚举

declare enum Direction2 {
    Up,
    Down,
    Left,
    Right
}

不能作为值来使用,暂时不知道怎么用

枚举转联合

const DirectionObj = {
    North: 'N',
    East: 'E',
    South: 'S',
    West: 'W'
};
type union1 = keyof typeof Direction;
// type union1 = "Up" | "Down" | "Left" | "Right"
type union2 = keyof typeof DirectionObj;
// type union2 = "North" | "East" | "South" | "West"

type转联合

type point = { x: number; y: number };
type union3 = keyof point;

满足条件的函数foo

// foo('xx', {name: 'hello'}) // correct
// foo(3232, 232) // correct
// foo('xx', 123) // error!

其定义为:
function foo(...args: [string, {name: string}] | [number, number]) {}

本文内容均参阅https://zhuanlan.zhihu.com/p/432942317

相关文章

  • TS的元组、枚举和联合

    标题中几个概念都是TS类型应用中非常好用的,类型应用好处很多,在此不细谈,主要讲讲元组等具体使用。基本概念不涉及,...

  • TS1 基本语法

    ts 指令 基本用法 object 函数 数组 元组 tuple(固定长度的数组) 枚举 enum 或 | 与 ...

  • lesson 4 TS 2021-04-23

    课程标题 路白-TS实战 知识点 基础知识 enum 枚举类型 type interface 联合类型 | 交叉类...

  • 元组&枚举

    元组: 固定长度的数组 枚举 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的...

  • 枚举

    使用枚举可以定义一些带名字的常量,TS支持数字的和基于字符串的枚举使用:通过枚举的属性来访问枚举成员,通过枚举的名...

  • 枚举

    枚举数据自定义的数据类型(元组)枚举语法:enum 枚举名称{case 名称case 名称...}

  • Swift(1)

    变量和常量 字符串 数组 字典 空格 元组 分支结构 枚举 函数

  • Typescript - 基础(二)

    TS 的基本类型和枚举类型 1、TS 的数据类型和 ES6 的数据类型 共有数据类型: Boolean Numbe...

  • 联合和枚举的区别

    联合和枚举的区别 联合的用法、语法和结构非常相似,但联合中所有成员分配的是同一块内存(最大成员的内存容量),用同一...

  • 495 - 第二章 结构、联合和枚举 41-50

    495 - 第二章 结构、联合和枚举 41-50 结构、联合和枚举的相似点是可以定义新的类型,首先,通过声明结构和...

网友评论

      本文标题:TS的元组、枚举和联合

      本文链接:https://www.haomeiwen.com/subject/hbkxurtx.html