Typescript: Checking Type of a Value, (interface, type)

参考文档: https://dev.to/lico/typescript-checking-type-of-value-interface-and-type-4dn8

Let’s say there are animal types and instances of them.

interface Cat {
  catId: number;
}

interface Dog {
  dogId: number;
}

type Bird = {
  birdId: number;
};

const cat: Cat = { catId: 1 };

const dog: Dog = { dogId: 1 };

const bird: Bird = { birdId: 1 };

Then, how do you check the type of the instances?

With typeof

console.log(typeof cat);

Output:

object

With instanceof

console.log(cat instanceof Cat);

You would get an error like below.

'Cat' only refers to a type, but is being used as a value here.

In Typescript, for type checking, you can use is operator for type checking.

const isCat = (cat: any): cat is Cat => (cat as Cat).catId !== undefined;
console.log(isCat(cat));

Output

true

As you see, it works well.

In my project, I had to do type checking frequently, so, I made a function using Generic Type to check the type of an instance.

const instanceOf = <T>(value: any, fieldName: string): value is T =>
  fieldName in value;

And you can use the function like this.

const animals = [cat, dog, bird, cat, dog, bird];
console.log(instanceOf<Cat>(cat, "catId"));

const cats = animals.filter((value) => instanceOf<Bird>(value, "birdId"));
console.log("cats", cats);

Output

true
cats [ { birdId: 1 }, { birdId: 1 } ]