typescript - 为什么 Exclude 实用程序类型与 TypeScript 中枚举上的映射条件类型结合使用时不能按预期工作?
问题描述
只是为了提供一点上下文:我正在构建一个非常复杂的表单,其中包含取决于先前输入中选择的条件所需值。
因此,我制作了以下对象来说明是否需要输入:
enum IssueType {
Error = "Error",
Advice = "Advice",
}
enum Category {
Software = "Software",
Hardware = "Hardware",
Other = "Other",
}
const inputNames = {
issueType: "issueType",
concerning: "concerning",
serialNumber: "serialNumber",
errorCode: "errorCode",
} as const;
const conditions: Conditions = {
[IssueType.Error]: {
~~~~~~~~~~~~~~~> Property 'Other' is missing in type ...
[Category.Software]: {
[inputNames.concerning]: true,
[inputNames.serialNumber]: true,
[inputNames.errorCode]: true,
},
[Category.Hardware]: {
[inputNames.concerning]: true,
[inputNames.serialNumber]: true,
[inputNames.errorCode]: true,
}
},
[IssueType.Advice]: {
[Category.Software]: {
[inputNames.concerning]: true,
[inputNames.serialNumber]: true,
[inputNames.errorCode]: true,
},
[Category.Hardware]: {
[inputNames.concerning]: true,
[inputNames.serialNumber]: true,
[inputNames.errorCode]: true,
},
[Category.Other]: {
[inputNames.concerning]: true,
[inputNames.serialNumber]: true,
[inputNames.errorCode]: true,
}
}
};
现在我的问题是类型(Conditions
在上面的片段中)是conditions
什么样的。我试过这个:
type Conditions = {
[K in IssueType]: {
[K in IssueType extends IssueType.Error
? Exclude<Category, Category.Other>
: Category]: {
[K in Exclude<
keyof typeof inputNames,
typeof inputNames.issueType
>]: boolean;
};
};
};
但是Exclude
ofCategory.Other
不起作用。只有当它的父对象键是 type 时,它才应该是一个强制属性IssueType.Error
。我在这里做错了什么?
我也想避免(如果可能的话)像这样的可空类型:
type Conditions = {
[K in IssueType]: {
[K in Category]?: {
[K in Exclude<
keyof typeof inputNames,
typeof inputNames.issueType
>]: boolean;
};
};
};
解决方案
在对象的第二层,您应该引用K
(从上一层)而不是IssueType
. 为此,您不能K
为所有级别命名密钥类型。
这是我K
用A
,B
和C
为清楚起见重命名的地方:
type Conditions = {
[A in IssueType]: {
[B in A extends IssueType.Error
? Exclude<Category, Category.Other>
: Category]: {
[C in Exclude<
keyof typeof inputNames,
typeof inputNames.issueType
>]: boolean;
};
};
};
检查操场。
推荐阅读
- html - 我很难在我的网站上的图像下将标题居中
- angular - 如何以编程方式隐藏 ngx-toaster?
- pytorch - RuntimeError:只有浮点 dtype 的张量才能需要渐变
- java - 如何使用 toString 方法在第三个对象中打印两个对象?
- date - 谷歌电子表格 - 谷歌脚本中两个日期之间的工作日数,节假日除外
- git - mac OS catalina 上的 git clone 命令面临问题
- sql - 使用 SQL Server 对学生成绩进行排序
- java - 从 Redis 获取密钥
- php - 文件链接在本地主机 http://127.0.0.1:8000 上的 laravel 中不可用
- javascript - 如何在 React Single page Web App 中使用 AVIF 图像