当前位置: 首页 > 知识库问答 >
问题:

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

漆雕兴平
2023-03-14

我有一个这样的界面

export interface IAppSection {
  key: string;
  order: number;
  header: string;
  content: string;
  modifiedAt: string;
  modifiedByEmployeeId: number;
  change: 'added' | 'removed' | 'updated' | 'none';
}

我想做的是当这个接口所涉及的对象被存储时,将更改默认为no

我尝试了change:'added'|'removed'|'updated'|'none'='none',但这不起作用。

我确信我在这里做错了什么,并且非常感谢关于我如何实现这一点的一些反馈。

共有3个答案

邢高澹
2023-03-14

另一种处理方法是根据需要标记所有IAppSection值,然后使用factory方法创建IAppSection对象。在factory方法中,您可以确保满足所有不变量,并为每个实例的可选参数指定默认值

    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'
       }
    }
翟宾实
2023-03-14

不能在接口中设置默认值,只能在实现中设置。

但默认情况下,它们是未定义的,这通常很好。

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

另请参阅:打字稿接口默认值

仉明知
2023-03-14

你不能用接口做到这一点。接口在运行时完全擦除,不能影响运行时行为;这是设计的。您可以创建一个类,并将默认值分配给字段,或者您可以创建一个函数来分配默认值。

我们甚至可以构造一个函数来帮助我们创建具有默认值的函数:

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'
})
 类似资料:
  • 我声明了一个该类型的变量,并初始化了所有属性 然后我稍后在一个init函数中为它们赋值实数 但我不喜欢在声明对象时为每个属性指定一组缺省空值,因为它们稍后将被设置为实值。我能告诉接口将我不提供的属性默认为null吗?什么会让我这么做: 而不会得到编译器错误。现在它告诉我 TS2322:类型“{}”不能分配给类型“ix”。类型“{}”中缺少属性“b”。

  • 问题内容: 是否可以通过SQL语句确保列的默认值为空字符串而不是? 问题答案: 是-使用DEFAULT约束:

  • 总之,是否可以有一个声明某些基属性但不限制其他属性的接口?这是我目前的情况: 我使用的是Flux模式,它定义了一个通用调度器: 然后,我用自己的有效负载类型创建一个调度程序,如下所示: 现在我有了一些动作代码,它应该分派一个带有一些附加数据的有效负载,但是< code>ActionPayload接口只允许< code>actionType。换句话说,这段代码: 给出编译错误,因为与接口不匹配。问题

  • 本文向大家介绍C#属性的默认值,包括了C#属性的默认值的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用初始化程序(C#6)设置默认值 如果它是只读的,则可以返回如下值:            

  • 问题内容: 我不知道如何使用Typescript为我的组件设置默认属性值。 这是源代码: 当我尝试使用这样的组件时: 我收到一条错误消息,指出缺少属性。我想使用默认值。我也尝试过在组件内部使用,但是我怀疑它没有任何作用。 如何使用默认属性值?我公司使用的许多JS组件都依赖于它们,不使用它们不是一种选择。 问题答案: 带类组件的默认道具 使用是正确的。您还应该使用接口(而不是类)作为道具和状态。 更

  • 20.1 属性默认值 Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。此外,Spring MVC可以在服务静态资源时将HTTP缓存的头部添加到响应中。 虽然缓存功能对生产环境非常有益,但在开发过程中可能会产生反作用,使您无法看到程序中刚刚做出的更改。由于这个原因,spring-boot-devtools默认会禁用那些缓存选项。 缓存选