【发布时间】:2021-10-26 14:09:02
【问题描述】:
我知道这听起来像是科学怪人的怪物想法,但请听我说完。我有一个类型:
export enum detailsDataTypes {
MACHINE = 'MACHINE',
USER = 'USER',
ABSTRACT = 'ABSTRACT',
}
export type sharedTypes = {
name?: string;
OEECategory?: string;
OAECategory?: string;
color?: string;
};
export type AbstractData = sharedTypes & {
layer: string;
type: detailsDataTypes.ABSTRACT;
};
export type UserData = sharedTypes & {
defaultTimeout: number;
stateAfterTimeout: string;
accessCanChoose: string;
accessCanOverwrite: string;
type: detailsDataTypes.USER;
};
export type MachineData = Omit<UserData, 'type'> & {
stateCategory: string;
canOverwriteOnlyByStates: boolean;
machineType: string;
type: detailsDataTypes.MACHINE;
};
而且这种类型适合包含数据。但我想要另一种类型来保存标题(人类可读)。这是我的想法:
const sharedHeaders: sharedTypes = {
name: 'Name',
OEECategory: 'OEE category',
OAECategory: 'OAE category',
color: 'Color',
};
export const AbstractHeaders: Omit<AbstractData, 'type'> = { ...sharedHeaders, layer: 'Layer' };
export const UserHeaders: Omit<UserData, 'type'> | { defaultTimeout: string } = {
...sharedHeaders,
defaultTimeout: 'Default timeout',
stateAfterTimeout: 'State after timeout',
accessCanChoose: 'Access - can choose',
accessCanOverwrite: 'Access - can overwrite',
};
export const MachineHeaders: Omit<MachineData, 'type'> = {
...UserHeaders,
stateCategory: 'State category',
machineType: 'Machine type',
canOverwriteOnlyByStates: 'Can overwrite only by states',
};
但是这里我们有一堆类型冲突,我不禁认为必须有更好的方法来做到这一点。
例如在这里,我得到解构后的所有内容都是字符串,它不能分配给从不输入。
export const MachineHeaders: Omit<MachineData, 'type'> = {
...UserHeaders,
stateCategory: 'State category', //here
machineType: 'Machine type', //here
canOverwriteOnlyByStates: 'Can overwrite only by states', //here
};
有没有更好的方法来实现我的目标?还是我想错了?
【问题讨论】:
-
我对@987654325@ 应该是什么感到困惑。是否有意使用
type MachineData = UserData & ...而不是type MachineData = sharedTypes & ...?如果是这样,你能解释一下吗?如果不是,这整个问题只是一个错字的结果还是发生了其他事情? -
基本上
UserData是sharedData+ 附加属性,MachineData是UserData+ 附加属性。 -
嗯,但是您的“附加”属性之一是
type,它与来自UserData的type冲突;type不可能同时是两个不同的字符串文字,因此编译器将整个事情简化为never... this 会为您工作吗?如果是这样,我会写一个答案;如果不是,请详细说明。 -
是的,这几乎是完美的。我尝试将
canOverwriteOnlyByStates转换为字符串,就像您对defaultTimeout所做的那样,但无法使其正常工作。你能详细说明吗? + 为什么这行得通,我的方法有什么问题? -
已编辑。现在应该可以了
标签: javascript reactjs typescript types