打字稿添加不需要的字符串类型以键入别名属性

时间:2020-06-14 15:20:26

标签: typescript

我有以下代码

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来自哪里

1 个答案:

答案 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

好的,希望能有所帮助;祝你好运!

Playground link to code