Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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_Generics_Default Value - Fatal编程技术网

typescript中的默认值和泛型

typescript中的默认值和泛型,typescript,generics,default-value,Typescript,Generics,Default Value,我想创建以下类: class-MyClass{ 构造函数(私有值:()=>Promise=()=>Promise.resolve({})){} } 当然,编译器会抱怨,因为类型T未知,因此无法为其分配空对象: Type '() => Promise<{}>' is not assignable to type '() => Promise<T>'. Type'()=>Promise'不可分配给Type'()=>Promise'。 但是每次我用默认值创建一

我想创建以下类:

class-MyClass{
构造函数(私有值:()=>Promise=()=>Promise.resolve({})){}
}
当然,编译器会抱怨,因为类型
T
未知,因此无法为其分配空对象:

Type '() => Promise<{}>' is not assignable to type '() => Promise<T>'.
Type'()=>Promise'不可分配给Type'()=>Promise'。
但是每次我用默认值创建一个新的
MyClass
对象时,我觉得将默认方法赋予构造函数是相当“肮脏”的


你认为写这篇文章的最佳方式是什么?

正如你所指出的,将
{}
指定为任何
T
的默认值是不安全的,因此编译器禁止这样做

如果要强制编译器接受默认值,可以使用类型断言:

class MyClass<T = {}> {
    constructor(private values: () => Promise<T> = (() => Promise.resolve({})) as any) {}

}
我们仍然使用类型断言将默认值输入参数,但该签名不可见,如果
{}
不是该类型的有效默认值,编译器将强制我们指定默认值

class MyClass<T = {}> {
    constructor(... values: {} extends T ?  [(() => Promise<T>)?]: [() => Promise<T>])
    constructor(private values: () => Promise<T> = (() => Promise.resolve({})) as any) {}

}

new MyClass<{}>()
new MyClass<{a?: number}>() // ok {} would be default
new MyClass<{a: number}>() // error {} would not be valid
new MyClass(() => Promise.resolve({}))
new MyClass(() => Promise.resolve({ a: 0})) // ok MyClass<{a: number;}>
new MyClass<{a: number;}>(() => Promise.resolve({ a: 0})) // ok MyClass<{a: number;}>