Z
ZHANK
编程在线教程TypeScript 教程satisfies 与 const 断言
高级类型

satisfies 与 const 断言

satisfies 保留类型信息、as const 不可变断言、readonly 数组

satisfies 与 const 断言

as const 让类型更精确(字面量而非宽泛类型),satisfies(TS 4.9+)在验证类型的同时保留精确推导。

学完本章你将: 掌握 as const 不可变断言、satisfies 运算符、readonly。


as const —— 收窄类型

typescript
// 不加 as const → 宽泛类型
const colors = ["red", "green", "blue"];
// type: string[]

// 加 as const → 精确字面量类型
const colorsConst = ["red", "green", "blue"] as const;
// type: readonly ["red", "green", "blue"]

// 实际用途:从数组提取联合类型
type Color = (typeof colorsConst)[number];  // "red" | "green" | "blue"

satisfies —— 检查类型但不改变推导

typescript
// 需求:确保对象符合某个类型,但保留每个属性的精确类型

type Color = { r: number; g: number; b: number };

const palette = {
    red: { r: 255, g: 0, b: 0 },
    green: { r: 0, g: 255, b: 0 },
    blue: { r: 0, g: 0, b: 255 },
} satisfies Record<string, Color>;  // ✅ 检查结构

// 保留了精确推导——key 是 "red" | "green" | "blue"
// 而不是 string
palette.red.r;  // ✅ 类型安全

satisfies 解决的实际问题

typescript
// ❌ 用类型注解——丢失精确 key
const map: Record<string, number> = { a: 1, b: 2 };
// map.a  // ✅ 但 key 是 string——不精确

// ✅ 用 satisfies——保持精确
const map = { a: 1, b: 2 } satisfies Record<string, number>;
// map.a  // number, key 类型为 "a" | "b"