【发布时间】:2023-02-23 21:20:07
【问题描述】:
我有一个通用基类:
export class BaseSerializer<
R extends boolean = false,
M extends boolean = false,
> {
readonly readonly: R;
readonly many: M;
constructor(options: {
readonly?: R,
many?: Many
} = {}) {
// @ts-ignore
this.readonly = options?.readonly || false;
// @ts-ignore
this.many = options?.many || false;
}
public fromDTO = (data: any): any => { return }
public toDTO = (data: any): any => { return }
}
当我在没有泛型的类中扩展它时,它按预期工作:
export class DateField<
R extends boolean = false,
M extends boolean = false,
> extends BaseSerializer<R, M> {
fromDTO = (data: any) => new Date(data)
toDTO = (data: any) => new Date(data).toISOString()
}
const serializer = new DateField({ many: true })
typeof serializer.many // true
但是当我扩展到一个带有附加泛型的类时,BaseSerializer 泛型赋值不起作用,R/M 泛型只获得它们的默认值。
export class EnumField<
T extends any = any,
R extends boolean = false,
M extends boolean = false,
> extends BaseSerializer<R, M>{
fromDTO = (data: any) => data as T
toDTO = (data: any) => data as T
}
type T = "a" | "b" | "c"
const serializer = new EnumField<T>({ many: true, readonly: true });
// tsafe tests
assert<Equals<typeof serializer["readonly"], true>>() // Type 'false' does not satisfy the constraint 'true'
assert<Equals<typeof serializer["many"], true>>() // Type 'false' does not satisfy the constraint 'true'
您能否建议,当扩展的 EnumField 类从其方法返回 T 泛型值并且同时正确解决 readonly 和 many 字段时,我如何实现行为?
【问题讨论】:
-
Afaik TS 无法处理我给你第一个通用参数并从传递的参数推断其余参数的这种混合。要么它应该推断出所有的通用类型,要么你必须传递所有这些类型。并且由于您传递了第一个,它不会从传递的对象中推断出另外两个,而是退回到默认值。但我不知道如何解决这个问题。
-
在这种情况下,替代方案有点奇怪,但我认为最好手动设置每个通用
标签: typescript typescript-typings typescript-generics typescript-class