export default class HelloWorld extends Vue {
flag!: string;
}
!是和?相对的,是typescript的语法,表示强制解析(也就是告诉typescript编译器,我这里一定有值)。你写?的时候再调用,typescript会提示可能为undefined
:是类型声明
ts官网解释
TypeScript 2.7引入了一个新的控制严格性的标记 --strictPropertyInitialization!
使用这个标记会确保类的每个实例属性都会在构造函数里或使用属性初始化器赋值。 在某种意义上,它会明确地进行从变量到类的实例属性的赋值检查。比如:
class C {
foo: number;
bar = "hello";
baz: boolean;
// ~~~
// Error! Property 'baz' has no initializer and is not assigned directly in the constructor.
constructor() {
this.foo = 42;
}
}
上例中, baz从未被赋值,因此TypeScript报错了。 如果我们的本意就是让 baz可以为 undefined,那么应该声明它的类型为 boolean | undefined。
在某些场景下,属性会被间接地初始化(使用辅助方法或依赖注入库)。 这种情况下,你可以在属性上使用 显式赋值断言来帮助类型系统识别类型。
class C {
foo!: number;
// ^
// Notice this exclamation point!
// This is the "definite assignment assertion" modifier.
constructor() {
this.initialize();
}
initialize() {
this.foo = 0;
}
}
显式赋值断言
尽管我们尝试将类型系统做的更富表现力,但我们知道有时用户比TypeScript更加了解类型。
上面提到过,显式赋值断言是一个新语法,使用它来告诉TypeScript一个属性会被明确地赋值。 但是除了在类属性上使用它之外,在TypeScript 2.7里你还可以在变量声明上使用它!
let x!: number[];
initialize();
x.push(4);
function initialize() {
x = [0, 1, 2, 3];
}
假设我们没有在 x后面加上感叹号,那么TypeScript会报告 x从未被初始化过。 它在延迟初始化或重新初始化的场景下很方便使用。
网友评论