简体   繁体   English

Typescript 从条件类型的联合子集中推断值

[英]Typescript infer value from subset of union for conditional type

I'm looking for a little help on type inference to narrow a union in TypeScript based on a conditional type.我正在寻找有关类型推断的一些帮助,以根据条件类型缩小 TypeScript 中的联合。

Our API takes a set of parameters and validates them.我们的 API 采用一组参数并对其进行验证。 As part of the validation process, it normalises all the values to make it easier for downstream processing.作为验证过程的一部分,它会将所有值标准化,以便于下游处理。 One of the parameters can be either an array of strings or an array of array of strings.其中一个参数可以是字符串数组或字符串数组。 When normalised that value is always converted to an array of array of strings.规范化后,该值始终转换为字符串数组的数组。

To avoid having to write out each validated type explicitly (and maintain them) I am trying to infer the validated params from the incoming params (which have the same keys) with the resolved value.为了避免必须明确地写出每个经过验证的类型(并维护它们),我试图从传入的参数(具有相同的键)中推断出经过验证的参数以及解析的值。 For example:例如:

type IncomingParams = {
   names: string[] | Array<string[]> | undefined
   ages: string[] | undefined
}

// Post validation the object is the following
type Validated = {
   names: Array<string[]>
   ages: string[]

}

This is what I came up with but it doesn't ensure that when there is the union, it always resolves to an array of array.这是我想出的,但它不能确保当有联合时,它总是解析为数组数组。

type ArrayUnion<T> = T[] | T[][];

type Params = {
   names: ArrayUnion<string>
   ages: string[]
}

type ValidatedParams<P> = {
    [K in keyof P]: P[K] extends ArrayUnion<infer U>
        ? U[][]
        : NonNullable<P[K]>;
};

const validated: ValidatedParams<Params> = {} as any;

validated.names // This should be string[][]
validated.ages // This should be string[]

It may be that Typescript cannot differentiate the union, so one option I've explored is to use & { readonly _sym: unique symbol } to uniquely identify ArrayUnion , although this approach hasn't worked either.可能是 Typescript 无法区分联合,所以我探索的一个选项是使用& { readonly _sym: unique symbol }来唯一标识ArrayUnion ,尽管这种方法也没有奏效。

I'd appreciate any help in advance.我会提前感谢任何帮助。

TypeScript playground TypeScript操场

It seems there the undefined being added caused some issues.似乎添加了undefined的内容导致了一些问题。 Here is a solution working in the TS playground这是在 TS 操场上工作的解决方案

https://www.typescriptlang.org/play?experimentalDecorators=false&emitDecoratorMetadata=false&target=2&module=1#code/PTAEHUHsCcGsEsB2BzUBnSAbArgF3pIgFBG4CeADgKagCC00AhmQKqIGIA8AKgHygBeUAG1uoAD6huwgLoAaUADplACmkyJU2bICUGydkQATKgDMkVIyXLVQABUZMAtmkGgA3kVDfEjJ1TQALjoGZjYOTjRcaCRkXi9vRmQA4KiYlFk5BNBIXAALKmhg+iZWdkJI6Nj4gF9rShoANUZMeCNGXEsHZzROO34hT29vYQBpUCRQWCoySFN7GWC7MY0qAA9O41cSsPKuJFNC0BZ44bPQAH5QADlCa+xMTEYAI0wqThPtGWzz4NvEe6PF5vPorXgAbiINUhRAAxoQoqAAG4tNodSzBZqtdqdIzdPy9fEuAYeGqgRiuRiIMgwlHY9FGRS+fyuUAgKR5eCuNB5SAPIygZ40NKxL5EOlo3GKJIBbzs7ic7m8-mC4VVDLfIjsgDChFh0CoHQmTgomH8iFwHQ4cIRuFAFEcBKWjpcbiGwxlQREACIsEZvfIfsyUj6AFZ+AIBrJnXIFIqgQwmcyISxQkjwxCIh09ABMzp6bp+nuCwl9mH9gbOwa9wlL4ZZUbDkDyiG9Cm97SRVADleGscKJbrEbQjbrzdb7c73fkPopFcDdSAA https://www.typescriptlang.org/play?experimentalDecorators=false&emitDecoratorMetadata=false&target=2&module=1#code/PTAEHUHsCcGsEsB2BzUBnSAbArgF3pIgFBG4CeADgKagCC00AhmQKqIGIA8AKgHygBeUAG1uoAD6huwgLoAaUADplACmkyJU2bICUGydkQATKgDMkVIyXLVQABUZMAtmkGgA3kVDfEjJ1TQALjoGZjYOTjRcaCRkXi9vRmQA4KiYlFk5BNBIXAALKmhg+iZWdkJI6Nj4gF9rShoANUZMeCNGXEsHZzROO34hT29vYQBpUCRQWCoySFN7GWC7MY0qAA9O41cSsPKuJFNC0BZ44bPQAH5QADlCa+xMTEYAI0wqThPtGWzz4NvEe6PF5vPorXgAbiINUhRAAxoQoqAAG4tNodSzBZqtdqdIzdPy9fEuAYeGqgRiuRiIMgwlHY9FGRS+fyuUAgKR5eCuNB5SAPIygZ40NKxL5EOlo3GKJIBbzs7ic7m8-mC4VVDLfIjsgDChFh0CoHQmTgomH8iFwHQ4cIRuFAFEcBKWjpcbiGwxlQREACIsEZvfIfsyUj6AFZ+AIBrJnXIFIqgQwmcyISxQkjwxCIh09ABMzp6bp+nuCwl9mH9gbOwa9wlL4ZZUbDkDyiG9Cm97SRVADleGscKJbrEbQjbrzdb7c73fkPopFcDdSAA

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM