[英]Typescript function return type based on optional arguments
如何解決壞類型?
interface X<T> {
abc:T
}
declare function deepLock<Obj extends Record<string, any>,>(obj: Obj): X<Obj>;
declare function deepLock<Obj extends Record<string, any>,>(obj: Obj, options: {}): X<Obj>;
declare function deepLock<
Obj extends Record<string, any>,
Action extends "freeze" | "seal" | "preventExtensions",
Options extends { action?: Action }
>(obj: Obj, options?: Options): Action extends 'freeze' ? X<Obj> : Obj
// ok
const x = deepLock({}) // expect X<{}>
const x2 = deepLock({}, {}) // expect X<{}>
// need to be fixed
const x3 = deepLock({}, {action: 'freeze'}) // expect X<{}>
const x4 = deepLock({}, {action: 'seal'}) // expect Obj
const x5 = deepLock({}, {action: 'preventExtensions'}) // expect Obj
所以你只需要稍微調整你的函數定義:
declare function deepLock<
Obj extends Record<string, any>,
Action extends "seal" | "preventExtensions" | "freeze",
>(obj: Obj, options?: { action?: Action }): 'freeze' extends Action ? X<Obj> : Obj;
您面臨的問題是Action
正在擴展"seal" | "preventExtensions" | "freeze"
"seal" | "preventExtensions" | "freeze"
"seal" | "preventExtensions" | "freeze"
,因此根據定義, Action extends "freeze"
將始終為真,因為它總是擴展它。
因此,為了正確縮小類型,您必須執行"freeze" extends Action
,這僅適用於 Action 的三種可能性之一。
希望這是有道理的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.