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