根据布尔参数使用条件返回类型

时间:2018-10-14 10:01:29

标签: typescript

我正在编写一个库,我想提供更准确的类型,以便库用户在下面的示例中不能选择错误的类型。

如果参数IPlayerStats设置为true,则此方法将返回IStatsItem[]convertJSONOutput

public async getStatsById(
    userId: string,
    timeWindow: TimeWindow = TimeWindow.Alltime,
    convertJSONOutput: boolean = true
  ): Promise<IPlayerStats | IStatsItem[]> {
  // Ommitted
}

问题:

我可以指定一个条件返回类型来指示将返回哪个接口(取决于convertJSONOutput布尔参数)吗?

1 个答案:

答案 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);

重要的是,每个重载都指定确切的文字值truefalse,而不是类型boolean。然后将返回类型与此相关。我在下面强调了这种关系。

//                              **** =>        ************
getStatsById(convertJSONOutput: true): Promise<IPlayerStats>;

我稍微修改了代码,所以我可以创建一个独立的示例,它假设TimeWindowIStatsItemIPlayerStats已经定义:

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);