-2

!在 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;
}
4

2 回答 2

3

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

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

编辑:现在您已经显示了完整的class定义,这就是Post该类具有的内容:

  • 一个idtype 的属性,number即使class构造中的代码没有显示初始化,也肯定是分配/初始化的。

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

  • 一个updatedAt属性也用new Date()

  • 即使代码中没有显示该初始化,也肯定会初始化类型为的title属性string,例如。idclass

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

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

于 2020-09-07T21:32:56.933 回答
0

bang 运算符!是 Typescript 的明确赋值断言运算符

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

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

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

class MyClass {
 let x!; // No error
}

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

于 2021-06-23T02:31:30.227 回答