Typescript泛型接受对象类型?

时间:2018-08-09 03:12:25

标签: typescript generics typescript2.0

(也许很明显,但是我是Typescript和Generic的新手)

在我的场景中,只有对象B和C扩展了对象A,并且我具有以下功能:

doSomething<T extends A>(param: T) {
  if (param instanceof B) {
    handeBType(param);
  } 
  if (param instanceof C) {
    handeCType(param);
  }
}

if语句作为参数被命中时,都不是'Object'的实例(这种情况在我的应用程序中本身就是问题,但不是我的问题的主题)。

我对泛型的理解是,在这种情况下,需要B或C实例作为'doSomething'函数的参数。普通对象不应该被允许吗?还是我想念一个重要的概念?

1 个答案:

答案 0 :(得分:0)

如果在函数声明中使用泛型,通常会在函数签名中的其他地方重用它,例如:

 doSomething<T extends A>(param: T):T {
      ....
 }

doSomething将接受作为A的子类型的类型,并返回相同的类型。这样,您可以为A的所有子类型重用doSomething,结果也将返回相同的子类型。

如果您要接受两个不“相关”的不同类,则可以执行以下操作:

doSomething(param: B|C) {
      ....
 }

在这种情况下,编译器将检查您要传递的参数是B还是C类型。

正如artem所述:泛型定义在运行时不再重要。众所周知,JavaScript引擎不知道类型,因此,当您在浏览器中或通过节点运行代码时,通过泛型声明的任何信息都将不再为人所知,并且无法帮助确定if子句是否为真。

我要解决的问题是,param是“ Object”的实例,并使其成为B或C的实例,您应该可以。

不确定我是否正确理解了您的问题,但希望这会有所帮助。