如何基于另一个Record的keyof定义允许0个或多个键的Record类型?
TypeScript 仅包含对象部分键的类型定义方案
你遇到的问题是因为Record<keyof typeof shape, any>会强制要求包含shape的所有键,要实现仅保留部分键的需求,有以下几种实用方案:
1. 允许任意子集:用Partial
Partial会把目标类型的所有属性转为可选,这样你可以自由选择包含哪些键:
const shape = {a: 1, b:2} // 写法1:基于Record包装Partial const foo: Partial<Record<keyof typeof shape, any>> = { a: 42, } // 写法2:更简洁,直接基于shape的类型包装Partial const foo: Partial<typeof shape> = { a: 42, }
2. 明确指定保留的键:用Pick
如果你只想保留特定的几个键,用Pick来精准选择需要的键名:
const shape = {a: 1, b:2} // 仅保留'a'键 const foo: Pick<typeof shape, 'a'> = { a: 42, } // 也可以同时指定多个键,比如只允许从'a'和'b'中选任意组合 const foo: Pick<typeof shape, 'a' | 'b'> = { a: 42, }
3. 限定可选键范围:结合Partial和Pick
如果需要在指定的几个键中选任意子集(包括空对象),可以把两者结合使用:
const shape = {a: 1, b:2, c:3} // 仅允许从'a'和'b'中选任意子集 const foo: Partial<Pick<typeof shape, 'a' | 'b'>> = { a: 42, }
内容的提问来源于stack exchange,提问作者Spadar Shut
相关产品推荐
相关产品推荐

