我有以下代码
type ValidateFn = (value: any) => boolean;
type ValidationSchema<T> = {
[P in keyof T]: Array<ValidateFn> | ValidateFn | ValidationSchema<T[P]>
}
interface Person {
name?: string;
age?: number;
}
const obj: ValidationSchema<Person> = {
'name': 'test' // <-- problem is here
}
Typescript编译器说ValidationSchema的字段是
string | ValidateFn | ValidateFn[]
哪里string
来的
形式的映射类型({[K in keyof T]: ...}
其中T
有一些类型参数)称为homomorphic,如microsoft / TypeScript#12447所介绍的(将其称为isomorphic)。在该请求请求中,它说
当用
T
同构映射类型替换原始类型时,我们仅产生该原始类型。
如果输入类似的原始类型string
,则会出现相同的原始类型:
type SomeHomomorphicMappedType<T> = { [K in keyof T]: Date };
type MappedString = SomeHomomorphicMappedType<string>; // string
由于ValidationSchema
是同态映射的递归式,当它递归向下进入name
和age
的性质Person
,它被用作ValidationSchema<string | undefined>
用于name
和ValidationSchema<number | undefined>
年龄。原始输入,原始输出:
type VSP = ValidationSchema<Person>
/* type VSP = {
name?: string | ValidateFn | ValidateFn[] | undefined;
age?: number | ValidateFn | ValidateFn[] | undefined;
} */
所以,这可以解释。
如果您想要其他行为,则可能需要使用条件类型在不存在时T extends object
与不存在时进行不同的操作。可能是这样的:
type ValidationSchemaMaybe<T> = {
[P in keyof T]: Array<ValidateFn> | ValidateFn | (
T[P] extends object ? ValidationSchemaMaybe<T[P]> : never
);
}
type VSPMaybe = ValidationSchemaMaybe<Person>
/* type VSPMaybe = {
name?: ValidateFn | ValidateFn[] | undefined;
age?: ValidateFn | ValidateFn[] | undefined;
} */
好的,希望能有所帮助;祝好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句