打字稿:定义没有字段的类型

时间:2019-01-22 09:47:31

标签: typescript type-systems domain-modelling

我正在处理旧数据集,并且试图在打字稿中对一些有意义的类型进行建模。在此示例中,假设我具有员工课程中有关工作经验的数据:

EMPLOY            | START    | END
'my first employ' | 20180901 | 20181001
'my last employ'  | 20180901 | null

如果ENDnull,则表示它是实际雇用的人。由于我有一些有关此域概念的业务规则,因此我想用类型对其进行建模。这是我的代码:

interface ActualExperience {
  actual: true,
  employ: string,
  start: Date,
  end: undefined // <-- no end! 
}

interface PreviousExperience {
  actual: false,
  employ: string,
  start: Date,
  end: Date     // <-- end has a value!
}

type Experience = ActualExperience | PreviousExperience

到目前为止,一切都很好。然后我想使用我的类型:

// this is OK
const previous: PreviousExperience = {
  actual: false,
  employ: 'my first employ',
  start: new Date(),
  end: new Date()
}

// ERROR! 
const actual: ActualExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date()
}

打字稿要求我明确定义end: undefined才能映射到ActualEmploy

// this is OK now!
const actual: ActualExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date(),
  end: undefined
}

这对我来说是不切实际的,因为我必须明确地向记录添加未定义的值,只是为了使我的编译器满意。

如何设计这种类型的模型?

2 个答案:

答案 0 :(得分:2)

有两种方法可以解决此问题。

首先,如果您的sed 's/^0.\{1\}/@/' file 中没有明确需要包含end: undefined的特定需求,则可以将其删除。

第二,根据您要执行的操作,使用其他接口可能更有意义:

ActualExperience

然后您可以指定当前接口实现interface BaseExperience { actual: boolean, employ: string, start: Date, end?: Date }

BaseExperience

最后,您可以直接使用interface ActualExperience extends BaseExperience { actual: true, employ: string, start: Date } interface PreviousExperience extends BaseExperience { actual: false, employ: string, start: Date, end: Date }

BaseExperience

并以您想要的方式使用const someExperience: BaseExperience = { actual: true, employ: 'my last employ', start: new Date() }

ActualExperience

答案 1 :(得分:1)

将您的界面声明为:

interface ActualExperience {
  actual: true,
  employ: string,
  start: Date
}

如果在以后的代码中调用Actual.end,则javascript将返回undefined,无需像在“ ActualExperience”界面上那样进行定义