TypeScript:有没有一种方法可以输入函数,以便它根据参数动态返回不同类型的结果

这是一个非常人为的例子,所以请耐心等待:


我有一个功能foo。它采用该类型的对象作为其参数


interface Foo {

  bar: number,

  baz: number,

  enabled?: boolean,

}

当enabled用户未提供或为 false 时,foo将返回类型的对象Result


interface Result {

  result: number

}

所以它只是将这两个数字相加,如下所示



function foo({bar, baz}: Foo): Result {

  return {

    result: bar + baz

  }

}


问题是:当enabled参数中提供 并将其设置为时true,我希望函数返回另一种类型的结果,其中它有另一个字段isEqual,该字段指示bar和baz是否相等。很喜欢


interface AnotherResult {

   result : number,

   isEqual: boolean

}

这是我们如何使用这个功能


const {result} = foo({baz: 1, bar: 2})


// or


const {result, isEqual} = foo({baz: 1, bar: 2, enabled: true})

理想情况下,当用户enabled: true在 params 中包含 时foo,他们可以 isEqual从 的返回值进行解构foo,而当他们不提供enabled或设置时enabled: false,他们无法isEqual从 的返回值进行解构 foo。


这是我的尝试,但我想不出一种方法来根据参数动态确定返回值的类型。我想知道 TypeScript 是否可以做到这一点


nterface Foo {

  bar: number,

  baz: number,

  enabled?: boolean,

}


interface Result {

  result: number

}


interface IsEqual {

  isEqual: boolean

}


type ResultWithIsEqualEnabled = Result & IsEqual



function foo({bar, baz, enabled = false}: Foo): ResultWithIsEqualEnabled {

  return {

    result: bar + baz

  }

}


白衣非少年
浏览 113回答 2
2回答

陪伴而非守候

您可以使用函数重载:interface Foo {&nbsp; bar: number,&nbsp; baz: number,}interface FooEnabled extends Foo {&nbsp; enabled: true,}interface Result {&nbsp; result: number;}interface IsEqual extends Result {&nbsp; isEqual: boolean}function foo(foo: FooEnabled): IsEqual;function foo<T extends Foo>(foo: T): Result;function foo({bar, baz, enabled}: FooEnabled): Result | IsEqual {&nbsp; const result = baz + bar;&nbsp;&nbsp;&nbsp; if (enabled) {&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; result,&nbsp; &nbsp; &nbsp; isEqual: bar === baz,&nbsp; &nbsp; }&nbsp; }&nbsp; return {&nbsp; &nbsp; result,&nbsp; }}const {result} = foo({&nbsp; bar: 5,&nbsp; baz: 5,});const {result: anotherOneResult, isEqual} = foo({&nbsp; bar: 5,&nbsp; baz: 5,&nbsp; enabled: true,})

Smart猫小萌

您可以在打字稿中为函数定义多个返回类型。对于您的示例,您可以这样做:&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;foo({bar,&nbsp;baz,enabled=false}:&nbsp;Foo):&nbsp;Result&nbsp;|&nbsp;AnotherResult&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(enabled==true)?{result:&nbsp;bar&nbsp;+&nbsp;baz,&nbsp;isEqual:&nbsp;true}:&nbsp;{result:&nbsp;bar&nbsp;+&nbsp;baz}&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript