【问题标题】:What is the `!` operator used for in MikroORM Typescript objects?MikroORM Typescript 对象中使用的 `!` 运算符是什么?
【发布时间】:2021-06-23 15:38:39
【问题描述】:

在 JS 对象的键声明中,冒号前有 ! 的语法是什么?

类的 MikroORM 语法

@Entity()
export class Post {
  // the @PrimaryKey invokes a function that takes the returned key/value pair and adds it as a column / information
  @PrimaryKey()
  id!: number;

  @Property({ type: "date", default: "NOW()" })
  createdAt = new Date();

  @Property({ type: "date", default: "NOW()", onUpdate: () => new Date() })
  updatedAt = new Date();

  @Property({ type: "text" })
  title!: string;
}

【问题讨论】:

  • 如果您提供一个代码示例给我们提供上下文,您的问题会更容易理解。
  • 从未见过。一个真实的例子怎么样? JavaScript (和许多其他语言) 中的! 是布尔not 运算符。
  • 根据您的描述,应该是a syntax error
  • 如果您可以发布一个更大的代码示例,这样我们就可以在上下文中看到它,这将有所帮助。但如果我不得不猜测,您正在处理 TypeScript(而不仅仅是 JavaScript),感叹号是 non-null assertion operator,它告诉 TypeScript 编译器该属性有一个值(在编译器无法推断的情况下)本身 - 例如,在构造函数中使用 Object.assign 时)。
  • { key!: "val" }在js控制台抛出语法错误

标签: typescript mikro-orm


【解决方案1】:

JavaScript 中,这是一个语法错误,但您显示的代码是 TypeScript 代码。 TypeScript 是添加类型信息的 JavaScript 的超集。在 TypeScript 中,text!: string 是一个类型定义:

  • 有一个叫做 text 的东西(在这种情况下,我希望它是一个变量,而不是一个对象属性)。
  • 它的类型是string
  • 这是definitely assigned,即使从上下文中看不出这是真的。

编辑:现在您已经展示了完整的 class 定义,下面是 Post 类的含义:

  • number 类型的 id 属性,即使 class 构造中的代码未显示初始化,也肯定已分配/初始化。

  • 使用new Date() 初始化的createdAt 属性(这将使TypeScript 推断其类型为Date

  • updatedAt 属性也初始化为 new Date()

  • 类型为stringtitle 属性与id 一样,肯定已初始化,即使class 代码中未显示该初始化。

  • 它使用与您的 ORM 相关的各种装饰器,例如 @PrimaryKey,将这些属性连接到模型并说明 ORM 应该如何处理它们。

那些明确的赋值/初始化断言在使用 ORM 的类代码中并不少见。

【讨论】:

    【解决方案2】:

    bang 运算符 ! 是 Typescript 的 definite assignment assertion operator

    这是一种告诉编译器“忽略此变量为空,即使它不应该是”的方法。

    当变量是类中的字段时,它不应该为空,并且您在 Typescript 中设置了 --strictPropertyInitialization 设置,例如:

    class MyClass {
     let x; // This throws an error "Property 'x' has no initializer
    }
    
    class MyClass {
     let x!; // No error
    }
    

    当您知道稍后将设置此变量时,这会派上用场。

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多