为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2023-08-05 19:37:52
这是一个非常人为的例子,所以请耐心等待:我有一个功能foo。它采用该类型的对象作为其参数interface Foo {  bar: number,  baz: number,  enabled?: boolean,}当enabled用户未提供或为 false 时,foo将返回类型的对象Resultinterface 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})// orconst {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 & IsEqualfunction foo({bar, baz, enabled = false}: Foo): ResultWithIsEqualEnabled {  return {    result: bar + baz  }}
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您可以使用函数重载:


interface Foo {

  bar: number,

  baz: number,

}


interface FooEnabled extends Foo {

  enabled: true,

}


interface Result {

  result: number;

}


interface IsEqual extends Result {

  isEqual: boolean

}


function foo(foo: FooEnabled): IsEqual;

function foo<T extends Foo>(foo: T): Result;

function foo({bar, baz, enabled}: FooEnabled): Result | IsEqual {

  const result = baz + bar;

  

  if (enabled) {

    return {

      result,

      isEqual: bar === baz,

    }

  }


  return {

    result,

  }

}


const {result} = foo({

  bar: 5,

  baz: 5,

});


const {result: anotherOneResult, isEqual} = foo({

  bar: 5,

  baz: 5,

  enabled: true,

})


查看完整回答
反对 回复 2023-08-05
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您可以在打字稿中为函数定义多个返回类型。对于您的示例,您可以这样做:

    function foo({bar, baz,enabled=false}: Foo): Result | AnotherResult { 
          return (enabled==true)?{result: bar + baz, isEqual: true}: {result: bar + baz} ;
    }


查看完整回答
反对 回复 2023-08-05
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信