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的泛型要么不指定,要么全指定,指定一个后就不会有自动推导了

未确认,先把此问题记录下来

评论

0 / 800
全部评论()