TypeScript:推断具有默认值的参数的类型



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函数的主体,但这里的意义是,在开始返回值时总是initialValidity,然后它就是验证器返回的值。此外,有效性应该是一个数组,其中包含任何类型的第一个元素和任意数量的任何类型的其余元素。

在当前的实现中,我有一个错误:

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;
}

游乐场链接

最新更新