打字稿:定义没有字段的类型
Typescript: define types without a field
我正在处理遗留数据集,我正在尝试在打字稿中对一些有意义的类型进行建模。在此示例中,假设我有来自员工课程的工作经验数据:
EMPLOY | START | END
'my first employ' | 20180901 | 20181001
'my last employ' | 20180901 | null
如果END
是null
,则表示它是实际雇员。因为我有几个关于这个领域概念的业务规则,所以我想用类型来建模。这是我的代码:
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()
}
Typescript 要求我明确定义 end: undefined
以便映射到 ActualEmploy
:
// this is OK now!
const actual: ActualExperience = {
actual: true,
employ: 'my last employ',
start: new Date(),
end: undefined
}
这对我来说非常不切实际,因为我必须明确地向记录添加一个未定义的值,只是为了让我的编译器满意。
如何设计这种类型的模型?
将您的界面声明为:
interface ActualExperience {
actual: true,
employ: string,
start: Date
}
如果在稍后的代码调用 actual.end 中,javascript 将 return 未定义,无需像您的界面上那样定义它 "ActualExperience"
您可以通过两种方式解决此问题。
首先,如果没有特定需要在您的 ActualExperience
中明确包含 end: undefined
,您可以将其删除。
其次,根据您要执行的操作,使用其他接口可能更有意义:
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
const actual: ActualExperience = {
actual: true,
employ: 'my last employ',
start: new Date()
}
我正在处理遗留数据集,我正在尝试在打字稿中对一些有意义的类型进行建模。在此示例中,假设我有来自员工课程的工作经验数据:
EMPLOY | START | END
'my first employ' | 20180901 | 20181001
'my last employ' | 20180901 | null
如果END
是null
,则表示它是实际雇员。因为我有几个关于这个领域概念的业务规则,所以我想用类型来建模。这是我的代码:
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()
}
Typescript 要求我明确定义 end: undefined
以便映射到 ActualEmploy
:
// this is OK now!
const actual: ActualExperience = {
actual: true,
employ: 'my last employ',
start: new Date(),
end: undefined
}
这对我来说非常不切实际,因为我必须明确地向记录添加一个未定义的值,只是为了让我的编译器满意。
如何设计这种类型的模型?
将您的界面声明为:
interface ActualExperience {
actual: true,
employ: string,
start: Date
}
如果在稍后的代码调用 actual.end 中,javascript 将 return 未定义,无需像您的界面上那样定义它 "ActualExperience"
您可以通过两种方式解决此问题。
首先,如果没有特定需要在您的 ActualExperience
中明确包含 end: undefined
,您可以将其删除。
其次,根据您要执行的操作,使用其他接口可能更有意义:
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
const actual: ActualExperience = {
actual: true,
employ: 'my last employ',
start: new Date()
}