我有以下代码
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
来自哪里
答案 0 :(得分:1)
{[K in keyof T]: ...}
的 Mapped types,其中T
是一些类型参数,称为{em> homomorphic ,如microsoft/TypeScript#12447中所述(称为< em>同构)。在该请求请求中,它说
当在同构映射类型中用原始类型替换
T
时,我们仅产生该原始类型。
如果输入诸如string
之类的原始类型,则会出现相同的原始类型:
type SomeHomomorphicMappedType<T> = { [K in keyof T]: Date };
type MappedString = SomeHomomorphicMappedType<string>; // string
由于ValidationSchema
是同态递归映射类型,因此当它递归到name
的{{1}}和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;
} */
与不使用conditional types时有所不同。也许像这样:
T extends object
好的,希望能有所帮助;祝你好运!