簡體   English   中英

TypeScript:使用默認值推斷參數類型

[英]TypeScript: Infer type of parameter with default value

4ex,這是我現在擁有的代碼

type Validity = [any, ...any[]];

interface StateValidator<V extends Validity, S> {
  (state: S): V;

  (state: S, dispatch: (validity: V)=>void): void;
}

function validate<V extends Validity, S, I extends Validity>(
    state: S,
    validator: StateValidator<V, S>,
    initialValidity: I = [null]
): I | V { 
    return initialValidity;
}

游樂場鏈接

validate function 的主體被省略,但這里的意思是,在開始時返回值始終是initialValidity ,然后是驗證器返回的值。 此外,有效性應該是具有任意類型的第一個元素和任意數量的任意類型的 rest 元素的數組。

在當前的實現中,我有一個錯誤:

Error:(16, 3) TS2322: Type '[null]' is not assignable to type 'I'.
  '[null]' is assignable to the constraint of type 'I', but 'I' could be instantiated with a different subtype of constraint 'ValidityState'.

據我了解, I應該推斷參數的類型,但為什么會出現該錯誤以及如何實現我想要的?

我希望它有下一個類型:

validate(number, (_: any) => [boolean | null, number]);
// [boolean | null, number] | [null]

validate(number, (_: any) => [boolean | null], [undefined]);
// [boolean | null, number] | [undefined]

正如在此 TypeScript github 問題中所討論並在此 SO 答案中描述的那樣,對於更一般的情況,此錯誤在邏輯上是正確的。 而且您的案子現在在 TS 中沒有解決。

我可以建議這個解決方案:

type Validity = [any, ...any[]];

interface StateValidator<V extends Validity, S> {
  (state: S): V;

  (state: S, dispatch: (validity: V)=>void): void;
}

function validateWithInitial<V extends Validity, S, I extends Validity>(
    state: S,
    validator: StateValidator<V, S>,
    initialValidity: I
): I | V { 
    return initialValidity;
}

function validate<V extends Validity, S>(
    state: S,
    validator: StateValidator<V, S>
): [null] | V { 
    const initialValidity: [null] = [null];
    return initialValidity;
}

游樂場鏈接

暫無
暫無

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

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