【发布时间】:2022-01-09 05:10:43
【问题描述】:
I wrote it again by summarizing the contents of the article.
我想知道如何根据对象属性值应用接口。
我在下面写了一个简单的示例代码。
一共有三个节点:root、dept、user。
指定每个节点对应的类型。因此,我们希望根据对象类型属性来指定接口。
但是,您可以看到您正在手动确认类型,因为您还没有找到解决方案。
为了解决这个问题,我认为应该用索引类型而不是条件类型来解决。
原因是条件类型期望根据泛型类型参数计算返回,但当前问题应该是根据现有类型计算而不是接收类型参数。
但是,即使使用两种方法也无法解决问题。任何帮助将不胜感激??????♂️
export enum NodeType {
root = "root",
dept = "dept",
user = "user",
}
interface Node {
readonly type: NodeType;
title: string;
}
interface RootNode extends Node {
type: NodeType.root;
}
interface DeptNode extends Node {
type: NodeType.dept;
departmentCode: string;
}
interface UserNode extends Node {
type: NodeType.user;
employeeNumber: string;
}
const nodeData: Node[] = [
{
type: NodeType.root,
title: "Company 1",
} as RootNode,
{
type: NodeType.dept,
title: "Department 1",
departmentCode: "557",
// The type is not inferred according to the object property type, so the type must be explicitly asserted.
} as DeptNode,
{
type: NodeType.user,
title: "User 1",
employeeNumber: "201911",
} as UserNode,
];
// I want to be the type of DeptNode interface because the type of object property is NodeType.dept.
const selectDept = nodeData.filter((x) => x.type === NodeType.dept);
selectDept.forEach((x) => {
console.log({
type: x.type,
title: x.title,
// The type is not affirmed in the node that fits the object property type, so you have to affirm the type yourself.
departmentCode: (x as DeptNode).departmentCode,
});
});
【问题讨论】:
标签: typescript types conditional-types typescript-types