【发布时间】:2020-10-16 00:22:04
【问题描述】:
我有一个第三方库,它返回包含对打字稿不透明的字段的对象(类型 OpaqueObject)。对于任何给定的OpaqueObject,我知道定义和/或需要哪些字段,但 Typescript 一无所知。给定OpaqueObject 的“模式”仅列出定义的字段,并带有一个布尔标志,指示它们是否需要存在:
type OpaqueObjectSchema = { [field: string]: boolean }
通过getField 函数从OpaqueObject 检索字段。 getField 使用类型谓词来调整返回类型,具体取决于是否需要该字段。获取不存在的必填字段会引发错误。这是签名:
getField<B extends boolean>(
obj: OpaqueObject, field: string, isRequired: B,
): B extends true ? string : (string | undefined)
我有一个类工厂函数 (opaqueObjectWrapperFactory),它接受 OpaqueObjectSchema 并输出一个包装类。例如,我有一个 OpaqueObject 类型,它有两个字段:f1 和 f2。 f1 是必需的;f2 可能未定义。我工厂生产的类的硬编码版本是:
class OpaqueObjectWrapper {
private obj: OpaqueObject
constructor(obj: OpaqueObject) {
this.obj = obj;
}
get f1(): string { return getField(this.obj, 'f1', true) }
get f2(): string | undefined { return getField(this.obj, 'f2', false) }
}
// OpaqueObjectWrapper is equivalent to the return value of:
opaqueObjectWrapperFactory({
f1: true,
f2: false,
});
我的问题是我无法弄清楚如何使这些生成的类对 Typescript 清晰可见。工厂应该这样工作:
// this declaration should have the same effect as hardcoding `OpaqueObjectWrapper`
class OpaqueObjectWrapper extends opaqueObjectWrapperFactory({ f1: true, f2: false });
显然我需要以某种方式使用泛型,但我不确定如何从输入模式派生返回接口。这可能吗?
【问题讨论】:
-
在
get f1()中应该是true,对吧? -
@ShivamSingla 是的,抱歉,已修复。
标签: typescript