我有一个根据选项键值返回不同类型的方法。
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 });
}
出什么问题了?
答案 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 | false
为T extends true ? Object : any[];
时,Object|any[]
将为T
。当boolean
为T
时,收益将为true
;当Object
为T
时,收益将为false
。
答案 1 :(得分:-2)
例如,您不能像在C#中那样重载方法在TypeScript中。您需要像这样组合类型:
class Test {
getData(options: {obj: boolean} = { obj: false }): Object | any[] {
if (options.obj) {
return {};
} else {
return [];
}
}
}
在多次重命名具有相同名称的函数时,您将在运行时得到最后一个作为最终定义。