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()
初始化 -
类型为
string
的title
属性,与id
一样,即使class
代码中没有显示初始化,也会被明确初始化。 -
它使用与ORM相关的各种装饰器,如
@PrimaryKey
,将这些属性连接到模型,并说明ORM应该如何处理它们。
在使用ORM的类代码中,这些明确的赋值/初始化断言并不罕见。
!
是Typescript的定赋值断言运算符。
这是一种告诉编译器";忽略这个变量为null,即使它不应该是"。
当变量是类上的字段时,它不应该为null,并且您已经在Typescript中设置了--strictPropertyInitialization
设置,例如:
class MyClass {
let x; // This throws an error "Property 'x' has no initializer
}
class MyClass {
let x!; // No error
}
当你知道以后会设置这个变量时,这就派上了用场