返回类型中的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很好,这是测试另一种方法的残余。更改了代码块-尽管如果您想真正显式,这不会有什么坏处。