TypeScript接口字符串属性的默认值

时间:2018-07-05 10:04:33

标签: typescript

我有一个看起来像这样的界面

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',但这不起作用。

我确定自己在这里做错了,非常感谢您提供一些有关如何实现此目标的反馈。

3 个答案:

答案 0 :(得分:1)

仅在实现中,不能在界面中设置默认值。

但是默认情况下,它们是未定义的,大多数情况下都很好。

对于“真实”实现,您的字符串联合看起来不错。

另请参阅: Typescript interface default values

答案 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'
       }
    }