簡體   English   中英

Typescript 函數根據可選參數返回類型

[英]Typescript function return type based on optional arguments

如何解決壞類型?

TS 沙箱。

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.

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