typescript 排除实用程序在Map类型中不起作用

b09cbbtk  于 2023-06-30  发布在  TypeScript
关注(0)|答案(1)|浏览(113)

我需要排除一些Map类型的文字:

type ReformValidator = "required" | "minLength" | "maxLength";

interface FieldsValidator {
    [key: string]: {
        [V in ReformValidator]?: any
    } & {
        [K in Exclude<string, ReformValidator>]?: {
            validator: () => boolean;
            message: string;
        }
    }
}

const validators: FieldsValidator = {
    firstName: {
        required: true
    }
}

预期没有错误,但有:
类型'{必需:true;}'不能赋值给类型'{required?:任何;...} & { [x:string]:{ ...};}'。

  • 类型“{必需:true; }'不能赋值给类型'{...};}'。
  • 属性“required”与索引签名不兼容。
  • 类型**'boolean'不可赋值给类型'{验证器:()=> boolean; string;}**'
brccelvz

brccelvz1#

首先,如果你不想把{ validator: () => boolean; message: string; }赋值给ReformValidator中的键,你必须限制它的类型。它不可能是any,因为{ validator: () => boolean; message: string; }满足any。我建议使用更具体的类型,如boolean | number
第二,将&替换为|,就可以了。

interface FieldsValidator {
    [key: string]: {
        [V in ReformValidator]?: boolean;
    } | {
        [K: string]: {
            validator: () => boolean;
            message: string;
        }
    }
}

您可以在[K: string]?中删除?,因为如果Record的键是string,则值不是具体的,因此不需要它们。
您可以通过使用内置类型来进一步简化声明:

type FieldsValidator = Record<
  string, 
  Partial<Record<ReformValidator, boolean | number>>
  | Record<string, {
    validator: () => boolean; 
    message: string
  }>
>;

也就是说:

  1. Record<K, V>等同于{ [key: K]: V }
  2. Partial<K>使K中的所有键都是可选的(使用?),因此Partial<Record<K, V>>等效于{ [key: K]?: V }

相关问题