将typescript捕获的泛型类型传播到类方法参数类型



捕获的泛型类型传播到方法参数类型时出现问题

class AClass<ExpectedOptions, RealOptions> {
constructor(public options: RealOptions) {}
method(options: Omit<ExpectedOptions, keyof RealOptions>) {}
}
interface Options {
a: string;
b: string;
}

如果AClass直接使用,它就不起作用

const aClass = new AClass<Options>({ a: 'value a'}); // should have only 1 type argument 
aClass.method({ }); // this method should be missing b property

但它与中产阶级完美配合

class A<RealOptions> extends AClass<Options, RealOptions> {
constructor(options: RealOptions) {
super(options);
}
}
const aClass = new A({ a: 'value a'});
aClass.method({ });

UPD:提供一个参数类型有一个变通方法,但我正在寻找一个具有捕获类型的oneliner

const options = { a: 'value a'};
const aClass = new AClass<Options, typeof options>(options);
aClass.method({ }); // it requires b

您想要做的事情不起作用。如果一个类型有多个泛型类型参数,则必须向编译器提供足够的信息,以便它推断出它们的所有类型。在第一种情况下,编译器没有任何信息可以推断ExpectedOptions的类型,因此这是一个编译错误。

然而,您不需要声明新的类,只需使用类型别名即可

type A<RealOptions> = AClass<Options, RealOptions>

最新更新