[英]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.