缩小类型的范围
typescript
function padLeft(padding: number | string, input: string): string {
if (typeof padding === "number") {
return " ".repeat(padding) + input;
}
return padding + input;
}
缩小真假范围
typescript
function getUsersOnlineMessage(numUsersOnline: number) {
if (numUsersOnline) {
return `There are ${numUsersOnline} online now!`;
}
return "Nobody's here. :(";
}
根据
in
运算符缩小范围
typescript
type Fish = { swim: () => void };
type Bird = { fly: () => void };
function move(animal: Fish | Bird) {
if ("swim" in animal) {
return animal.swim();
}
return animal.fly();
}
根据
instanceof
缩小范围
typescript
function logValue(x: Date | string) {
if (x instanceof Date) {
console.log(x.toUTCString());
} else {
console.log(x.toUpperCase());
}
}
根据控制流自动分析
typescript
function example() {
let x: string | number | boolean;
x = Math.random() < 0.5;
console.log(x); // let x: boolean
if (Math.random() < 0.5) {
x = "hello";
console.log(x); // let x: string
} else {
x = 100;
console.log(x); // let x: number
}
return x; // let x: string | number
}
通过类型断言
typescript
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
区分联合类型
typescript
interface Circle {
kind: "circle";
radius: number;
}
interface Square {
kind: "square";
sideLength: number;
}
type Shape = Circle | Square;
function getArea(shape: Shape) {
switch (shape.kind) {
case "circle":
return Math.PI * shape.radius ** 2; // (parameter) shape: Circle
case "square":
return shape.sideLength ** 2; // (parameter) shape: Square
default:
// never 可以检查是否处理全部情况
const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}