
本文介绍使用 DeepPartial 工具类型,递归地将类及其嵌套属性(包括数组元素)的所有字段设为可选,从而安全、泛型化地支持部分初始化,避免类型错误。
本文介绍使用 deeppartial
在 TypeScript 中,当类具有嵌套结构(如数组中包含继承自基类的子类实例)时,仅用 Partial
根本原因在于:Partial
✅ 推荐方案:DeepPartial 工具类型
DeepPartial
type DeepPartial<t> = {
[K in keyof T]?: DeepPartial<t>;
};</t></t>
该类型能自动处理数组:T[K] 若为 Bar[],则 DeepPartial
使用 Scrapfly SDK(scrapfly-sdk)在 TypeScript 或 JavaScript 中进行网页抓取,用于用户请求抓取 URL、绕过反爬虫防护、渲染页面等场景。
应用到 Baz 类中:
class Baz {
bars: Bar[];
constructor({ bars = [] }: DeepPartial<baz> = {}) {
this.bars = bars.map(bar => new Bar(bar)); // ✅ bar 类型为 DeepPartial<bar>
}
}</bar></baz>
现在以下调用全部通过类型检查:
const foo = new Foo(); // { foo: "foo" }
const bar = new Bar({ foo: "x", bar: "y" });
const baz1 = new Baz({ bars: [foo] }); // ✅ Foo 满足 DeepPartial<bar>(bar 可缺省)
const baz2 = new Baz({ bars: [bar] }); // ✅ Bar 完全匹配
const baz3 = new Baz({ bars: [{ foo: "z" }] }); // ✅ 仅提供父类字段</bar>
⚠️ 注意事项与最佳实践
- DeepPartial 不处理函数或 Date 等非对象类型:默认将其视为不可递归(T[K] 原样保留),符合常规预期;
- 避免无限递归:TypeScript 会自动截断过深嵌套(通常 >50 层),实际项目中无需担心;
-
与构造函数逻辑对齐:确保 Bar 构造函数本身接受 Partial
(如示例中已实现),否则 new Bar(bar) 仍会报错; -
扩展性极强:无论 Baz 新增多少层嵌套(如 bars: { items: Bar[] }[]),DeepPartial
仍能自动适配,无需手动维护类型声明。
✅ 总结
相比硬编码 bars?: Partial










