跳到主要内容

TypeScript使用

使用元组生成联合类型

// 字符串数组
const color = ['♥','♦','♣','♠'];
// 添加as const
const values = ['1','2','3','4','5','6','7','8','9','10','J','Q','K'] as const;

// 没有as const,仍然当作字符串类型
type Color = typeof values[number]
// 有as const可以取得联合类型
type Values = typeof values[number]

// 创建扑克牌方法,希望color、value的值是存在于上面数组里的
function create(value:Values, color:Color){}

从对象、数组、枚举生成类型、联合

一行速记模板

  • 从对象值得联合:type V = typeof obj[keyof typeof obj];
  • 从只读数组得联合:type V = typeof arr[number];
  • 从字符串枚举得联合:type V = EnumName;

示例:

export const TASK_STATUS_PAIRS = {
"0": "准备进行",
"1": "正在进行",
"-1": "任务冲突"
} as const;

// 键的类型
export type TaskStatusCode = keyof typeof TASK_STATUS_PAIRS; // "0" | "1" | "-1"
// 值的联合类型
export type TaskStatusValue = typeof TASK_STATUS_PAIRS[TaskStatusCode];
// 等价:typeof TASK_STATUS_PAIRS[keyof typeof TASK_STATUS_PAIRS]

从动态对象生成数组

export const TASK_STATUS_VALUES = Object.values(TASK_STATUS_PAIRS) as readonly TaskStatusValue[];

字符串枚举

export enum TaskStatusEnum {
Ready = "准备进行",
Running = "正在进行",
Conflict = "任务冲突"
}

// 其类型本身就是值联合
export type TaskStatusEnumValue = TaskStatusEnum; // "准备进行" | "正在进行" | "任务冲突"

// 获取所有值数组(运行时)
export const TASK_STATUS_VALUES_ENUM = Object.values(TaskStatusEnum) as readonly TaskStatusEnumValue[];

数字枚举、单独映射中文(不常用)

export enum TaskStatusCodeEnum {
Ready = 0,
Running = 1,
Conflict = -1
}

export const TASK_STATUS_LABELS: Record<TaskStatusCodeEnum, string> = {
[TaskStatusCodeEnum.Ready]: "准备进行",
[TaskStatusCodeEnum.Running]: "正在进行",
[TaskStatusCodeEnum.Conflict]: "任务冲突"
} as const;

export type TaskStatusValue = typeof TASK_STATUS_LABELS[TaskStatusCodeEnum]; // "准备进行" | "正在进行" | "任务冲突"