ts泛型缺省问题记录
今天写一个库的时候,写出来的类型体操怎么都不符合预期,所以把它抽象出来做一个demo
interface Options {
enable?: boolean;
}
interface Configs<T extends Options = Options> {
options: T;
}
class Test<OPT extends Options = Options> {
protected configs: Configs<OPT>;
constructor(configs: Partial<Configs<OPT>> = {}) {
this.configs = { options: {} as OPT, ...configs };
}
test<T extends string = '', O extends OPT = OPT>(
s: T,
o: O,
): O['enable'] extends true ? `${T} foo` : OPT['enable'] extends true ? `${T} foo` : 'bar';
test(s: string, o = {} as OPT) {
return o.enable ? s + ' foo' : this.configs.options.enable ? s + ' foo' : 'bar';
}
}
const test = new Test<Options>();
const t1: 'c foo' = test.test('c', { enable: true });
const t2: 'c foo' = test.test<'c', { enable: true }>('c', { enable: true });
const t3: 'c foo' = test.test<'c'>('c', { enable: true }); // error 推导出来的是 'bar' 不传第二个泛型怎么让它返回和上面一样的类型呢
console.log(t1, t2, t3);
大佬的指点:
ts的泛型要么不指定,要么全指定,指定一个后就不会有自动推导了
未确认,先把此问题记录下来
评论