Let's say you have an enum Animal and a string value and you want to check if the value is an animal.

enum Animal {
Cat = "cat",
Dog = "dog",
}

const someInputValue = "cat";

// TS compiler will show an error,
// because "cat" is not assignable to Animal.
// We need to check if `someInputValue` is an animal.
someFunctionThatExpectsAnAnimal(someInputValue);

TypeScript supports type guards and type predicates that lets you do this. The function isAnimal accepts a string value and returns a boolean whether the value is a valid animal or not.

function isAnimal(value: string): value is Animal {
return Object.values<string>(Animal).includes(value);
}

If the function returns true, TypeScript knows that the value is an Animal and infers that type inside the if statement. You don't need to write as Animal.

if (isAnimal(someInputValue)) {
// TypeScript knows that `someInputValue` is of type `Animal`
someFunctionThatExpectsAnAnimal(someInputValue);
}