我正在编写一个函数,通过将字段名作为参数传递来判断是否需要字段.我希望函数只接受那些在配置类型中映射到具有Required属性的ValidationConfig的字段名称.我知道我可以将函数参数类型设置为ValidationField,如下所示,它起作用了.

type Field = 'name' | 'surname' | 'age' | 'height' | 'school';

type ValidationField = Extract<Field, 'name' | 'surname'>;
type RequiredConfig = {required?: boolean};
type ValidationConfig<T> = T extends ValidationField ? RequiredConfig : {};

type Config = {
    [K in Field]?: ValidationConfig<K> & {visible?: boolean};
}

const config: Config = {name: {required: true, visible: true}, surname: {required: true, visible: true}, age: {visible: false}}

const checkRequired = (field: ValidationField) => config[field]?.required

然而,我想知道,如果我们不能访问Validationfield类型,而只能访问Config、验证配置和RequiredConfig类型,是否有方法实现相同的行为?

const checkRequired = <T extends Field>(field: Config[Field] extends ...? T : never) => config[field]?.required

推荐答案

如果您需要判断Config来重新创建ValidationField,那么看起来您应该只获取那些值可以赋给RequiredConfig | undefined的属性名称(其中undefined是因为当您读取它们时,optional properties总是包含undefined作为可能性):

type MyValidationField = { [K in keyof Config]-?:
    Config[K] extends RequiredConfig | undefined ? K : never
}[keyof Config]
//   ^? type MyValidationField = "name" | "surname"

这是一个distributive object type,其中我们map overConfig(使用-? mapping modifier)以go 除可选属性周围的奇怪之处),并判断Config的属性是否是RequiredConfig.如果是,我们将键名称作为属性,否则将never.然后,我们将映射类型与keyof Config进行index into,以获得我们关心的union个关键字名称.

你可以看到这是"name" | "surname",和ValidationField一样.然后,您的checkRequired()函数仍然适用于MyValidationField而不是ValidationField:

const checkRequired = (field: MyValidationField) => config[field]?.required

Playground link to code

Typescript相关问答推荐

如何从TypScript中的接口中正确获取特定键类型的所有属性?

处理API响应中的日期对象

在将对象从一个对象转换成另一个对象时,可以缩小对象的键吗?

具有动态键的泛型类型

隐式键入脚本键映射使用

未在DIST中正确编译TypeScrip src模块导入

如何在typescript中设置对象分配时的键类型和值类型

React Typescript项目问题有Redux-Toolkit userSlice角色问题

刷新页面时,TypeScrip Redux丢失状态

转换器不需要的类型交集

有没有办法取消分发元组的联合?

如何将对象数组中的键映射到另一种对象类型的键?

类型脚本-在调用期间解析函数参数类型

KeyOf关键字在特定示例中是如何工作的

无法缩小深度嵌套对象props 的范围

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

参数未映射泛型返回类型

将带有额外id属性的Rust struct 展平回TypeScript单个对象,以返回wasm-bindgen函数

将对象数组传递给 Typescript 中的导入函数

对象只能使用 Typescript 中另一个对象的键