(也许很明显,但是我是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'函数的参数。普通对象不应该被允许吗?还是我想念一个重要的概念?
答案 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的实例,您应该可以。
不确定我是否正确理解了您的问题,但希望这会有所帮助。