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_Typescript Generics - Fatal编程技术网

返回类型中的Typescript条件泛型类型

返回类型中的Typescript条件泛型类型,typescript,typescript-generics,Typescript,Typescript Generics,如果值不存在,如何调整返回类型的泛型 type Foo = {}; class Bar<P extends Foo> { static make<P extends Foo>(a?: P): Bar<P> { return new Bar(); } } Bar.make() // return Bar<Foo> type Foo={}; 类栏{ 静态make(a?:P):条{ 返回新条(); } } make(

如果值不存在,如何调整返回类型的泛型

type Foo = {};

class Bar<P extends Foo> {
    static make<P extends Foo>(a?: P): Bar<P> {
        return new Bar();
    }
}

Bar.make() // return Bar<Foo>
type Foo={};
类栏{
静态make(a?:P):条

{ 返回新条(); } } make()//返回条

但我需要做一些事情,比如:

class Bar<P extends Foo> {
    static make<P extends Foo>(a?: P): Bar<P extends undefined ? never : Foo> {
        return new Bar();
    }
}

Bar.make() // return Bar<never>
Bar.make({}) // return Bar<Foo>
类栏{
静态make(a?:P):条{
返回新条();
}
}
make()//返回条
make({})//返回条

您需要应用默认类型
never

type Foo = {test: number}; // Example implementation of foo, used in test cases below

class Bar<P extends Foo> {
  // Allow P to extend from Foo, then assign never as the default
  static make<P extends Foo = never>(a?: P): Bar<P> {
    return new Bar();
  }
}

const t1 = Bar.make(); // Bar<never>
const t2 = Bar.make({ test: 2 }) // Bar<{test: 2}> (subtype of Foo)
const t3: Bar<Foo> = Bar.make({ test: 2 }); // Bar<Foo> (explicit typecasting to Bar<Foo>)
const t4 = Bar.make({ bazz: 0 }); // Type error, { bazz: 0 } is not assignable to Foo
type Foo={test:number};//foo的示例实现,在下面的测试用例中使用
类栏{
//允许P从Foo扩展,然后将never指定为默认值
静态make(a?:P):条

{ 返回新条(); } } 常数t1=Bar.make();//酒吧 constt2=Bar.make({test:2})//Bar(Foo的子类型) 常数t3:Bar=Bar.make({test:2});//条(显式向条类型转换) 常数t4=Bar.make({bazz:0});//类型错误,{bazz:0}不可分配给Foo


这里是一个展示不同结果的例子。

@luky添加了一些解释和一个游乐场链接:)
Foo | never
Foo
相同;出于某种原因,您是否将其写成
Foo | never
?@jcalz很好,这是测试另一种方法的残余。更改了代码块-尽管如果您想真正显式,这不会有什么坏处。