gpt4 book ai didi

typescript - typescript 中的默认值和泛型

转载 作者:行者123 更新时间:2023-12-04 11:18:47 27 4
gpt4 key购买 nike

我想创建以下类:

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

当然,编译器会提示,因为类型 T是未知的,因此不可能为其分配空对象:
Type '() => Promise<{}>' is not assignable to type '() => Promise<T>'.

但是我觉得每次创建一个新的 MyClass 时都给构造函数提供默认方法相当“脏”。默认对象 T值(value)。

你认为最好的写法是什么?

最佳答案

正如您所指出的,指定 {} 是不安全的作为任何 T 的默认值因此编译器禁止它。

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

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

}

缺点是对于 {} 的类型不是有效的默认值,您将获得无效的默认值,并且编译器不会就此发出警告。

一种不同的方法是使用条件类型和 Tuples in rest parameters and spread expressions创建一个基于 T 的实际类型而变化的构造函数签名.
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;}>

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

关于typescript - typescript 中的默认值和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52476818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com