TypeScript satisfies
Feb-21, 2025 · 1min
TypeScript satisfies
使一个表达式符合某个类型,而不改变表达式的类型。
ts
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];
const palette: Record<Colors, string | RGB> = {
red: [255, 0, 0],
green: "#00ff00",
bleu: [0, 0, 255],
// 这里会报错,因为 bleu 不是 Colors 类型
};
// 这里会报错,因为 palette.green 可能是 string 类型,也可能是 RGB 类型,而 string 类型没有 toUpperCase 方法
const greenNormalized = palette.green.toUpperCase();
使用 satisfies
ts
type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];
const palette = {
red: [255, 0, 0],
green: "#00ff00",
bleu: [0, 0, 255],
// 这里会报错,因为 bleu 不是 Colors 类型
} satisfies Record<Colors, string | RGB>;
// 这里不会报错,因为 palette.green 是 string 类型,有 toUpperCase 方法
const greenNormalized = palette.green.toUpperCase();
这里使用 satisfies 后,palette 符合 Record<Colors, string | RGB>
类型,并且保留了其原有的类型,所以这个推断 palette.green 是 string 类型
其他使用场景
确保对象的 keys 符合某个类型
ts
type Colors = "red" | "green" | "blue";
// 确保对象的 keys 符合 Colors 类型
const favoriteColors = {
red: "yes",
green: false,
blue: "kinda",
platypus: false,
// 错误:platypus 没有在 Colors 类型中列出
} satisfies Record<Colors, unknown>;
// 所有关于 'red', 'green', 和 'blue' 属性的信息都被保留了,不是 unknown 类型
const g: boolean = favoriteColors.green;
确保对象的属性值符合某个类型
ts
type RGB = [red: number, green: number, blue: number];
// 确保对象的属性值符合 string 和 RGB 类型
const palette = {
red: [255, 0, 0],
green: "#00ff00",
blue: [0, 0],
// 错误:blue 的类型既不是 string 类型,也不是 RGB 类型
} satisfies Record<string, string | RGB>;
// 每个属性的信息仍然被保留。
const redComponent = palette.red.at(0); // red 是 RGB 类型
const greenNormalized = palette.green.toUpperCase(); // green 是 string 类型