我有一个看起来像这样的界面
export interface IAppSection {
key: string;
order: number;
header: string;
content: string;
modifiedAt: string;
modifiedByEmployeeId: number;
change: 'added' | 'removed' | 'updated' | 'none';
}
我想做的是在存储与此接口相关的对象时将change
的默认值为none
。
我尝试过change: 'added' | 'removed' | 'updated' | 'none' = 'none'
,但这不起作用。
我确定自己在这里做错了,非常感谢您提供一些有关如何实现此目标的反馈。
答案 0 :(得分:1)
仅在实现中,不能在界面中设置默认值。
但是默认情况下,它们是未定义的,大多数情况下都很好。
对于“真实”实现,您的字符串联合看起来不错。
答案 1 :(得分:1)
您不能使用界面执行此操作。接口是在设计时完全删除的,并且不会影响运行时的行为。您可以改为创建一个类,并为该字段分配默认值,也可以创建一个函数来分配默认值。
我们甚至可以构造一个函数来帮助我们使用默认值创建此类函数:
interface IAppSection {
key: string;
order: number;
header: string;
content: string;
modifiedAt: string;
modifiedByEmployeeId: number;
change: 'added' | 'removed' | 'updated' | 'none';
}
function withDefaults<T>() {
return function <TDefaults extends Partial<T>>(defs: TDefaults) {
return function (p: Pick<T, Exclude<keyof T, keyof TDefaults>> & Partial<TDefaults>) :T {
let result: any = p;
for (let k of Object.keys(defs)) {
result[k] = result[k] || defs[k];
}
return result;
}
}
}
const appSection = withDefaults<IAppSection>()({
change: 'none'
})
答案 2 :(得分:0)
另一种处理方法是根据需要标记所有 IAppSection 值,然后使用工厂方法创建 IAppSection 对象,在工厂方法内部,您可以确保所有满足不变量并为每个实例的可选参数分配默认值
const createAppSection = (
key: string,
order: number,
header: string,
content: string,
modifiedAt: string,
modifiedByEmployeeId: number,
change?: 'added' | 'removed' | 'updated' | 'none';
) : IAppSection => {
// perform invariants validations
if(!key){
throw Error('key required');
}
return {
key, order, content, modifiedAt, modifiedByEmployeeId,
change: change || 'none'
}
}