亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號