簡體   English   中英

TypeScript 條件類型 - 在所有情況下都返回一種類型

[英]TypeScript conditional types - returns one type at all cases

在我的項目中,我想根據參數類型選擇要應用於參數的 function。 所以有一個基本接口和一個擴展接口,它向基本接口添加了一個屬性。 所以我想檢查這個添加的屬性是否undefined並將其傳遞給正確的類型 function。 所以這是代碼(和編輯條件類型 )

interface BaseType {
  field1: string
  field2: string
}

interface ExtendedType extends BaseType {
  id: number
}

const values: any = {
  id: undefined,
  field1: "String",
  field2: "Value"
}

const requestObj = {
  field1: values['field1'],
  field2: values['field2']
}

const request = values['id'] !== undefined ? {...requestObj, id: values['id']}: requestObj

type BaseOrExtended = typeof request extends ExtendedType ? ExtendedType : BaseType;

function baseFunction(request: BaseType) {
  console.log('Do BASE action')
}

function extendedFunction(request: ExtendedType) {
  console.log('Do Extended action')
}

function isExtended(item: ExtendedType| BaseType): item is ExtendedType {
  return (item as ExtendedType).id !== undefined
}

const baseOrExtendedFunction = isExtended(request) ? baseFunction : extendedFunction

baseOrExtendedFunction(request as BaseOrExtended)

但我確實得到了一個錯誤

“BaseType”類型的參數不能分配給“ExtendedType”類型的參數。 “BaseType”類型中缺少屬性“id”,但在“ExtendedType”類型中是必需的。

並且無論id的值是什么,它都想執行extendedFunction 並且始終type BaseOrExtended = BaseType

我錯過了關於這些條件的一些東西嗎?

由於類型的解析將在運行時發生,因此無法靜態確定。

更改代碼以在運行時處理這兩種情況,如下所示:

const baseOrExtendedFunction = (request: BaseOrExtended) => !isExtended(request) ? baseFunction(request) : extendedFunction(request)

baseOrExtendedFunction(request)

TS游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM