Skip to content

Zawężanie typów

Zawężanie typów w TypeScript to proces uściślania typu zmiennej wewnątrz bloku warunkowego. Jest to przydatne podczas pracy z typami unii, gdy zmienna może mieć więcej niż jeden typ.

TypeScript rozpoznaje kilka sposobów zawężania typu:

Strażniki typów typeof

Strażnik typu typeof to szczególny strażnik typów w TypeScript, który sprawdza typ zmiennej na podstawie jej wbudowanego typu JavaScript.

const fn = (x: number | string) => {
if (typeof x === 'number') {
return x + 1; // x is number
}
return -1;
};

Zawężanie na podstawie prawdziwości

Zawężanie na podstawie prawdziwości w TypeScript polega na sprawdzeniu, czy zmienna ma wartość prawdziwą (truthy) czy fałszywą (falsy), aby odpowiednio zawęzić jej typ.

const toUpperCase = (name: string | null) => {
if (name) {
return name.toUpperCase();
} else {
return null;
}
};

Zawężanie na podstawie równości

Zawężanie na podstawie równości w TypeScript polega na sprawdzeniu, czy zmienna jest równa określonej wartości, aby odpowiednio zawęzić jej typ.

Jest używane w połączeniu z instrukcjami switch oraz operatorami równości, takimi jak ===, !==, == i !=, w celu zawężania typów.

const checkStatus = (status: 'success' | 'error') => {
switch (status) {
case 'success':
return true;
case 'error':
return null;
}
};

Zawężanie za pomocą operatora in

Zawężanie za pomocą operatora in w TypeScript to sposób zawężania typu zmiennej na podstawie tego, czy właściwość istnieje w typie zmiennej.

type Dog = {
name: string;
breed: string;
};
type Cat = {
name: string;
likesCream: boolean;
};
const getAnimalType = (pet: Dog | Cat) => {
if ('breed' in pet) {
return 'dog';
} else {
return 'cat';
}
};

Zawężanie za pomocą instanceof

Zawężanie za pomocą operatora instanceof w TypeScript to sposób zawężania typu zmiennej na podstawie jej funkcji konstruktora poprzez sprawdzenie, czy obiekt jest instancją określonej klasy lub interfejsu.

class Square {
constructor(public width: number) {}
}
class Rectangle {
constructor(
public width: number,
public height: number
) {}
}
function area(shape: Square | Rectangle) {
if (shape instanceof Square) {
return shape.width * shape.width;
} else {
return shape.width * shape.height;
}
}
const square = new Square(5);
const rectangle = new Rectangle(5, 10);
console.log(area(square)); // 25
console.log(area(rectangle)); // 50