【发布时间】:2021-05-29 20:34:38
【问题描述】:
我试图弄清楚是否有可能(仅使用类型声明)以某种方式适合可选字段的具体默认值 --- 在泛型类的上下文中,这样这个默认值的类型仍然是绑定到另一个必填字段
type Handler<T> = (msg: T) => boolean;
type Transformer<T> = (msg: SimpleMsg) => T;
class Consumer<T> {
handler: Handler<T>;
transformer: Transformer<T>;
constructor(handler: Handler<T>, transformer?: Transformer<T>) {
this.handler = handler;
this.transformer = transformer || defaultTransformer
}
}
默认转换器可以是这样的(只是传递值):
const defaultTransformer = (msg: SimpleMsg) => {
console.log('BoringTranfomer! ' + JSON.stringify(msg));
return msg;
}
目前它(正确地)警告我 T 可以用与 SimpleMsg 无关的类型实例化
因此,我会 - 以某种方式想以 terms 的变压器(类型?)定义处理程序的类型(反之亦然?) - 并强制该类型为 @987654326 @以防变压器未定义(即未提供)
我知道可以使用工厂方法或其他方法来解决它,我将处理程序明确定义为Handler<SimpleMsg>,但我真的想知道它是否可以通过类型和单个入口点解决
谢谢!
【问题讨论】:
-
完整的旁注,但它困扰我
PlainPojo是一个坏名字。 POJO 中的 P 已经代表“plain”。所以,PlainPojo是一个“普通的 JavaScript 对象” -
我喜欢 90%。我已经知道了,因此如果
handler采用SimpleMsg,您只能省略transformer,但在那种情况下我无法将T推断为SimpleMsg。 tsplay.dev/lWYXbm -
没关系,我们可以将
SimpleMsg设置为默认值:)
标签: typescript generics typescript-generics conditional-types