如何在TypeScript中为多维对象强制最大深度与值约束的类型定义
多维对象的TypeScript类型约束问题
简介
我在TypeScript文件中有一个多维对象,示例如下:
const store = { key_1: "value", key_2: 123, key_3: true, key_4: { key_4_1: "value", key_4_2: 123, key_4_3: false, key_4_4: [ "value_4_4_1", "value_4_4_2", "value_4_4_3", ] }, key_5: [ "value_5_1", "value_5_2", "value_5_3", ], value_5: { key_1: "copy-pasted-from-parent-object", key_2: 123, key_3: true, key_4: { key_4_1: "value", key_4_2: 123, key_4_3: false, key_4_4: [ "value_4_4_1", "value_4_4_2", "value_4_4_3", ] }, key_5: [ "value_5_1", "value_5_2", "value_5_3", ] } };
请注意,每个对象及其子对象、数组、值的顺序、键数量、长度、值和大小都可能不同,不影响最终结果。
背景
我想要创建一个interface或type来强制以下规则:
- 数组和对象中的值(非数组或嵌套对象的情况)必须是
number、boolean或string类型。 - 不能存在
undefined、null或NaN值。 - 数值不能为负数(即小于
0)。 - 字符串值不能为空。
- 对象的嵌套深度不能超过4层(4个嵌套对象)。
- 数组中不会包含嵌套对象或数组。
- 数组项的值始终为
string类型。 - 所有对象的键必须为
string类型。
方案1及结果
我尝试使用以下接口作为该对象的类型:
interface Store { [key: string]: string | number | boolean | string[] | Store; }
但该接口无法强制规则3、4和5。
针对规则3和4的方案2及结果
为简化规则3和4的类型检查,我实现了一个循环函数来检查字符串值(核心逻辑为string.length > 0 && number >= 0),并使用throw new TypeError(...)来提示错误。
问题
如何修改该interface或使用更合适的type来更高效地强制这些规则?
内容的提问来源于stack exchange,提问作者Malekai
相关产品推荐
相关产品推荐

