我有一个对象X
,其方法getY()
在typescript中返回一个方法Y
的对象a()
。
这样的表达是什么意思:
X.getY()!.a()
我猜!
运算符用于检查null,但具体如何工作?在语言中定义的位置?
答案 0 :(得分:50)
它被称为"非空断言运算符"它告诉编译器x.getY()
不为空。
这是一个新的打字稿2.0功能,您可以在what's new页面中阅读相关内容,其中包含:
一个新的! post-fix表达式运算符可用于断言它的 操作数在类型的上下文中是非null且非undefined 检查员无法得出结论。具体来说,操作 X!生成x类型的值,其中包含null和undefined。 类似于形式x和x的类型断言为T,! 非空断言运算符只是在发出的中删除 JavaScript代码。
// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
// Throw exception if e is null or invalid entity
}
function processEntity(e?: Entity) {
validateEntity(e);
let s = e!.name; // Assert that e is non-null and access name
}
There's an issue for documenting this feature: Document non-null assertion operator (!)
答案 1 :(得分:2)
null | undefined
这是一个简单的例子:
let nullable1: null | number;
let nullable2: undefined | string;
let foo = nullable1! // type foo: number
let fooz = nullable2! // type fooz: string
它基本上从类型中删除了 null | undefined
我什么时候使用它?
Typescript 已经非常擅长推断类型,例如使用 typeguards:
let nullable: null | number | undefined;
if (nullable) {
const foo = nullable; // ts can infer that foo: number, since if statements checks this
}
但是有时我们会遇到如下情况:
type Nullable = null | number | undefined;
let nullable: Nullable;
validate(nullable);
// Here we say to ts compiler:
// I, the programmer have checked this and foo is not null or undefined
const foo = nullable!; // foo: number
function validate(arg: Nullable) {
// normally usually more complex validation logic
// but now for an example
if (!arg) {
throw Error('validation failed')
}
}
我个人的建议是尽可能避免使用此运算符。让编译器完成静态检查您的代码的工作。但是,在某些情况下,尤其是对于供应商代码,使用此运算符是不可避免的。