如何创建仅包含预定义部分可用键的TypeScript类型?
如何让映射类型支持省略部分预定义键?
你现在遇到的问题很明确:用[k in MyKeys]声明的映射类型会强制要求所有预定义键都必须存在,但实际开发中你想省略部分键(比如bb)。这是因为TypeScript里的映射类型默认会把每个属性设为必填的,我们只需要调整类型定义就能解决,分两种场景给你方案:
场景1:所有预定义键都可以省略
如果你的需求是MyKeys里的所有键都可选,直接在映射的时候给属性加上?标记就行:
export type MyKeys = 'aa' | 'bb' | 'cc'; // 给每个属性添加?,将其设为可选 export type MyType = { [k in MyKeys]?: any; };
这样使用时就可以随意省略任意键,比如:
let mySpecialObj: MyType = { aa: 'key', cc: 'key' }; // 完全合法,bb无需声明
场景2:仅部分键可选,其余必填
如果只想让特定的键(比如bb)可选,其他键必须存在,可以用Pick/Exclude结合交叉类型实现:
export type MyKeys = 'aa' | 'bb' | 'cc'; // 先提取必填键生成必填类型,再和可选键的类型交叉 export type MyType = Pick<{ [k in MyKeys]: any }, Exclude<MyKeys, 'bb'>> & { bb?: any };
或者更灵活的写法,先明确必填/可选键集合,再组合类型:
export type MyKeys = 'aa' | 'bb' | 'cc'; // 指定必填键集合 type RequiredKeys = Exclude<MyKeys, 'bb'>; // 组合必填类型与可选类型 export type MyType = { [k in RequiredKeys]: any } & Partial<{ [k in Exclude<MyKeys, RequiredKeys>]: any }>;
这种方式下,aa和cc必须存在,bb可填可不填:
// 合法:省略了bb let mySpecialObj1: MyType = { aa: 'key', cc: 'key' }; // 也合法:包含了所有键 let mySpecialObj2: MyType = { aa: 'key', bb: 'key', cc: 'key' };
内容的提问来源于stack exchange,提问作者ofir_aghai
相关产品推荐
相关产品推荐

