Typescript重载类型布尔值不能分配为false类型

时间:2018-06-19 16:02:25

标签: javascript typescript

我有一个根据选项键值返回不同类型的方法。

class Test {
  getData(options: { obj: true }): Object;
  getData(options: { obj: false }): any[];
  getData(): any[];
  getData(options = { obj: false }): Object | any[] {
    if (options.obj) {
      return {};
    } else {
      return [];
    }
  }
}

当将obj传递为true时,我将返回否则为array的对象。很好。

const instance = new Test();
const result = instance.getData({ obj: true }); // inffered as array
const result2 = instance.getData(); // inffered as object

问题是当我需要使用动态值时会引发错误:

  

布尔类型不能分配为false

function getResult(obj: boolean = false ) {
  return instance.getData({ obj });
}

出什么问题了?

2 个答案:

答案 0 :(得分:3)

由于{ obj }的类型在编译时仅被称为{ obj: boolean },因此编译器不知道选择任何重载,因此您必须显式提供一个占用{{1 }}(由于实现签名不算作该函数的公共签名),在这种情况下,编译器将不会做任何魔术:

{ obj: boolean }

修改

您还可以在方法签名中使用条件类型,这将使​​签名数量减少:

class Test {
    getData(options: { obj: true }): Object;
    getData(options: { obj: false }): any[];
    getData(options: { obj: boolean }): Object | any[];
    getData(): any[];
    // This signature is the implementation and is not conidered when resolving the method 
    getData(options = { obj: false }): Object | any[] {
        if (options.obj) {
            return {};
        } else {
            return [];
        }
    }
} 

由于class Test { getData<T extends boolean>(options: { obj: T }): T extends true ? Object : any[]; getData(): any[]; // This signature is the implementation and is not conidered when resolving the method getData(options = { obj: false }): Object | any[] { if (options.obj) { return {}; } else { return []; } } } const instance = new Test(); const result = instance.getData({ obj: true }); // inffered as array const result2 = instance.getData(); // inffered as object function getResult(obj: boolean = false) { return instance.getData({ obj }); // inferred as Object|any[] } 和条件类型分布在并集上, 当type boolean = true | falseT extends true ? Object : any[];时,Object|any[]将为T。当booleanT时,收益将为true;当ObjectT时,收益将为false

答案 1 :(得分:-2)

例如,您不能像在C#中那样重载方法在TypeScript中。您需要像这样组合类型:

class Test {

  getData(options: {obj: boolean} = { obj: false }): Object | any[]  {
   if (options.obj) {
        return {};
      } else {
        return [];
      }
   }
}

在多次重命名具有相同名称的函数时,您将在运行时得到最后一个作为最终定义。