什么是"!"用于MikroORM Typescript对象的运算符



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中,这是一个语法错误,但您显示的代码是TypeScript代码。TypeScript是JavaScript的超集,用于添加类型信息。在TypeScript中,text!: string是一个类型定义,表示:

  • 有一种叫做text的东西(在这种情况下,我希望它是一个变量,而不是对象属性(
  • 其类型为string
  • 它肯定是被分配的,即使从上下文中看这不是真的

Edit:现在您已经显示了完整的class定义,下面是Post类具有的内容:

  • number类型的id属性,即使class构造中的代码没有显示初始化,它也会被明确分配/初始化。

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

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

  • 类型为stringtitle属性,与id一样,即使class代码中没有显示初始化,也会被明确初始化。

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

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

bang运算符!是Typescript的定赋值断言运算符。

这是一种告诉编译器";忽略这个变量为null,即使它不应该是"。

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

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

当你知道以后会设置这个变量时,这就派上了用场

相关内容

  • 没有找到相关文章

最新更新