簡體   English   中英

為什么 TypeScript 條件類型對於可選參數不能正常工作?

[英]why TypeScript condition type can't work correctly for optional parameter?

我想知道函數的第一個參數是可選的,所以我寫了這個:

type F1 = (payload?: number) => null;
type Res1 = F1 extends (a?: any) => any ? 1 : 2; // got 1
type Res2 = F1 extends (a: any) => any ? 1 : 2; // got 1, but 2 expected

type F2 = (payload: number) => null;
type Res3 = F2 extends (a?: any) => any ? 1 : 2; // got 1, but 2 expected
type Res4 = F2 extends (a: any) => any ? 1 : 2; // got 1

它們都等於1 ,為什么? 我該怎么做?

您可以將“擴展”閱讀為“可分配給”。

type F1 = (payload?: number) => null;
type Res2 = F1 extends (a: any) => any ? 1 : 2; // got 1, but 2 expected

(payload?: number) => null分配給(a: any) => any嗎? 讓我們檢查:

// Works
const res2: (a: any) => any = (payload?: number) => null;

(a: any) => any接受a任何值,包括 undefined 或有效負載指定的數字,因此我們可以看到(payload?: number) => null是可分配的,因此F1 extends (a: any) => any應該評估為 true 並返回 1。

相反,您可以使用 Partial 使 function 的 arguments 測試可選,並檢查生成的 arguments 是否可分配給原始 ZDBC11CAABD8BDA99F77E6FB4DABD882E7DZ


type ArgumentType<F extends (...args: any) => any> = F extends (...args: infer A) => any ? A : never;

type FirstArgumentOptional<F extends (...args: any) => any> =
    Partial<ArgumentType<F>> extends ArgumentType<F>
        ? true 
        : false


type T1 = FirstArgumentOptional<(a: any) => any>; // false
type T2 = FirstArgumentOptional<(a?: any) => any>; // true
type T3 = FirstArgumentOptional<() => any>; // true

暫無
暫無

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

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