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]
答案 0 :(得分:1)
如this TypeScript github issue中讨论和this SO answer中所述,对于更一般的情况,此错误在逻辑上是正确的。您的案件现在还没有在TS中得到解决。
我可以建议这种解决方案:
public static int CountWords(this string line)
{
var wordCount = 0;
for (var i = 0; i < line.Length; i++)
if (line[i] == ' ' || i == line.Length - 1)
wordCount++;
return wordCount;
}
}