根据TypeScript中的参数值更改返回类型

Liv*_*ner 2 typescript

我有以下功能:

function doThing(shouldReturnObject: boolean): string | object {
    return shouldReturnObject ? { hello: 'world' } : 'hello world';
}
Run Code Online (Sandbox Code Playgroud)

我希望返回值在shouldReturnObjectequals为true 时为对象,但在为false时为字符串.

Liv*_*ner 7

免责声明:在大多数情况下,这不被视为最佳做法.如果你想这样做,你应该重新考虑你的架构.

-

解决方案是重载函数.为每个参数值重载函数并更新返回类型,如下所示:

doThing(shouldReturnObject: true):  object
doThing(shouldReturnObject: false): string
doThing(shouldReturnObject: boolean): string | object {
  return shouldReturnObject ? { hello: 'world' } : 'hello world';
}
Run Code Online (Sandbox Code Playgroud)

如果参数是对象,也可以实现这一点.例如:

interface DoThingsSettings {
  lazyLoading: boolean;
}

doThing(settings: { lazyLoading: false} &  DoThingsSettings): object[]
doThing(settings: { lazyLoading: true} &  DoThingsSettings): string[]
doThing(settings: DoThingsSettings):  object[] |  string[] {
  return settings.lazyLoading ? [{ name: 'Peter' }] : ['/user/1'];
}
Run Code Online (Sandbox Code Playgroud)

  • 在许多情况下,这是完全合法的。您没有提到的一件事是很重要的一点,那就是必须在编译时(如您所愿)对shouldReturnObject`值必须进行“ true”或“ false”硬编码。您不能将变量值用于任何调用它的原因,因为这样做的全部目的是让* compiler *知道返回类型将是什么。 (2认同)