Typescript:泛型类型的自定义类型保护?

Typescript:泛型类型的自定义类型保护?,typescript,Typescript,我有两个相关的类型,我想用一个自定义类型的guard来区分它们。它们是泛型类型(在现实生活中,它们采用多个类型arg,但这是简化的) 我的问题是:是否可以编写一个泛型的isCat类型保护,它返回一个谓词,该谓词对任何cat类型cat都有效(返回true)?在我的real app中,T有很多可能的选项,所以把它们全部写出来并不实用 类狗{ 年龄:数字| T=1 树皮(){console.log(“woof”)} } 班猫{ 年龄:数字| T=1 meow(){console.log(“meow”)

我有两个相关的类型,我想用一个自定义类型的guard来区分它们。它们是泛型类型(在现实生活中,它们采用多个类型arg,但这是简化的)

我的问题是:是否可以编写一个泛型的
isCat
类型保护,它返回一个谓词,该谓词对任何cat类型
cat
都有效(返回true)?在我的real app中,
T
有很多可能的选项,所以把它们全部写出来并不实用

类狗{
年龄:数字| T=1
树皮(){console.log(“woof”)}
}
班猫{
年龄:数字| T=1
meow(){console.log(“meow”)}
}
函数isCat(animal:any):animal是Cat{//这是无效的,泛型类型Cat需要1个arg
在动物中返回“喵喵”
}
功能f(动物:任何){
if(isCat(动物))
动物。喵喵()
}
f(新Cat())
f(新狗())

您可以使用保留字
unknown
告诉typescript这是一个具有未知模板参数的Cat

class Dog<T> {
  age: number|T = 1
  bark() { console.log("woof")}
}

class Cat<T> {
  age: number|T = 1
  meow() { console.log("meow")}
}

function isCat(animal: any): animal is Cat<unknown> {
  return 'meow' in animal;
}

function f(animal: any) {
  if (isCat(animal))
    animal.meow()
}

f(new Cat<number>())
f(new Dog<number>())
类狗{
年龄:数字| T=1
树皮(){console.log(“woof”)}
}
班猫{
年龄:数字| T=1
meow(){console.log(“meow”)}
}
功能isCat(动物:任何):动物为猫{
在动物身上返回“喵喵”;
}
功能f(动物:任何){
if(isCat(动物))
动物。喵喵()
}
f(新Cat())
f(新狗())

我也会做一些类似的事情:

class Animal<T> {
  age: number|T = 1
}

class Dog<T> extends Animal<T> {
  bark() {
    console.log('woof');
  }
}

class Cat<T> extends Animal<T> {
  meow() {
    console.log('meow');
  }
}

function isCat(animal: Animal<unknown>): animal is Cat<unknown> {
  return 'meow' in animal;
}

function f(animal: Animal<unknown>) {
  if (isCat(animal))
    animal.meow()
}

f(new Cat<number>())
f(new Dog<number>())
类动物{
年龄:数字| T=1
}
狗类动物{
树皮(){
控制台日志(“woof”);
}
}
猫科动物{
喵喵(){
console.log('meow');
}
}
功能isCat(动物:动物):动物是猫{
在动物身上返回“喵喵”;
}
功能f(动物:动物){
if(isCat(动物))
动物。喵喵()
}
f(新Cat())
f(新狗())

是的,我的真实代码是这样的(公共基类)。我刚刚了解到,您也可以这样制作类型保护:
函数isCat(animal:animal):animal是Cat{…}
,其工作方式与使用
unknown
相同。