Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 检查不带泛型实例的泛型的类型_Typescript - Fatal编程技术网

Typescript 检查不带泛型实例的泛型的类型

Typescript 检查不带泛型实例的泛型的类型,typescript,Typescript,我想检查泛型的类型,但不检查它的实例 比如: doThing<T extends Foo | Bar>(someArg: string): T { if (T extends Foo) return functionThatReturnsFoo(someArg); else return functionThatReturnsBar(someArg); } doThing(someArg:string):T{ if(T扩展Foo)返回函数返回sfoo(someArg);

我想检查泛型的类型,但不检查它的实例

比如:

doThing<T extends Foo | Bar>(someArg: string): T {
  if (T extends Foo) return functionThatReturnsFoo(someArg);
  else return functionThatReturnsBar(someArg);
} 
doThing(someArg:string):T{
if(T扩展Foo)返回函数返回sfoo(someArg);
else返回函数返回sbar(someArg);
} 

这可能吗?

正如@jcalz所提到的,这是不可能的,因为在将TS编译为JS时,类型系统被删除

可能的解决办法是:

  • 使用专用的返回类型创建两个完全独立的函数
  • 向当前函数传递一个标志以指示所需的调用,然后使返回为联合类型
  • 将所需函数作为参数传递到
    doThing
    ,然后将返回值作为联合类型

在我的例子中,我刚刚创建了两个具有相似逻辑的专用函数。它不那么干燥,但更易于阅读和测试。

我认为如果Foo和Bar都来自同一个祖先,并且您在声明中使用了该祖先,您就可以做到这一点。。否则不行,至少不应该这样。当代码被发送到JS时,TypeScript的类型系统就完全失效了。因此,代码将变成类似于
doThing(someArg){if(T扩展Foo)…}
。但是你可以看到JS中没有
T
,所以没有什么需要检查的。如果要在运行时确定
T
,则需要在运行时具有
T
类型的一些值,然后对其执行某种类型的类型保护。你能解释一下你的用例吗?我甚至不太明白您在实践中希望如何使用
doThing()
。@jcalz这是有道理的。用例是我有两个逻辑几乎相同的函数,但在内部调用两个不同的函数,返回类型不同。我希望我可以在这里使用泛型,但我认为我必须有条件地调用这两个函数中的一个,或者将目标内部函数作为参数传递给
doThing
,并使用union返回类型。