我正在编写一个库,我想提供更准确的类型,以便库用户在下面的示例中不能选择错误的类型。
如果参数IPlayerStats
设置为true,则此方法将返回IStatsItem[]
或convertJSONOutput
。
public async getStatsById(
userId: string,
timeWindow: TimeWindow = TimeWindow.Alltime,
convertJSONOutput: boolean = true
): Promise<IPlayerStats | IStatsItem[]> {
// Ommitted
}
问题:
我可以指定一个条件返回类型来指示将返回哪个接口(取决于convertJSONOutput
布尔参数)吗?
答案 0 :(得分:4)
基于布尔参数返回不同类型的最简单方法是重载:
function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: true): Promise<IPlayerStats>;
function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: false): Promise<IStatsItem[]>;
function getStatsById(
userId: string,
timeWindow: TimeWindow = TimeWindow.Alltime,
convertJSONOutput: boolean = true
): Promise<IPlayerStats | IStatsItem[]> {
调用它时,然后根据参数的值推断出缩小的类型:
// Promise<IPlayerStats>
const a = getStatsById('', undefined, true);
// Promise<IStatsItem[]>
const b = getStatsById('', undefined, false);
重要的是,每个重载都指定确切的文字值true
或false
,而不是类型boolean
。然后将返回类型与此相关。我在下面强调了这种关系。
// **** => ************
getStatsById(convertJSONOutput: true): Promise<IPlayerStats>;
我稍微修改了代码,所以我可以创建一个独立的示例,它假设TimeWindow
,IStatsItem
和IPlayerStats
已经定义:
function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: true): Promise<IPlayerStats>;
function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: false): Promise<IStatsItem[]>;
function getStatsById(
userId: string,
timeWindow: TimeWindow = TimeWindow.Alltime,
convertJSONOutput: boolean = true
): Promise<IPlayerStats | IStatsItem[]> {
// Ommitted
}
// Promise<IPlayerStats>
const a = getStatsById('', undefined, true);
// Promise<IStatsItem[]>
const b = getStatsById('', undefined, false);