如何通过函数从sharedProps提取指定属性生成新TypeScript类型?
从共享类型中提取指定属性并转为必填类型的最优方案
你可以直接用TypeScript内置的工具类型组合,封装成可复用的泛型类型,不用逐个手动创建单独类型。
核心思路是结合Pick和Required两个内置工具:
Pick<T, K>:从类型T中筛选出指定的属性集合KRequired<T>:将类型中所有可选属性转为必填属性
自定义可复用工具类型
// 从类型T中提取指定属性K,并强制转为必填 type PickRequired<T, K extends keyof T> = Required<Pick<T, K>>;
针对sharedProps的使用示例
比如你需要提取className和children并让它们成为必填属性:
// 直接指定属性联合类型 type OnlyClassNameAndChildren = PickRequired<sharedProps, 'className' | 'children'>; // 等价于手动定义的类型: // type OnlyClassNameAndChildren = { // className: string; // children: ReactNode; // }
如果想通过属性名数组来指定(更直观),可以用const断言把数组转为联合类型:
const targetProps = ['className', 'children'] as const; // 从数组中推导属性联合类型 type TargetProps = typeof targetProps[number]; type OnlyTargetProps = PickRequired<sharedProps, TargetProps>;
额外场景:保留原属性可选性
如果不需要把属性转为必填,只是提取指定可选属性,直接用Pick即可:
type PickOptional<T, K extends keyof T> = Pick<T, K>; // 示例:提取className和children,保留原可选性 type OptionalClassNameAndChildren = PickOptional<sharedProps, 'className' | 'children'>;
这种方案的优势在于:
- 完全基于TypeScript原生能力,无需额外依赖
- 泛型设计可以适配任意源类型,不止局限于
sharedProps - 支持批量指定属性,一次定义即可复用
- 精准满足你“仅包含指定属性且非可选”的需求
内容的提问来源于stack exchange,提问作者Sebastian Chacon
相关产品推荐
相关产品推荐

