【发布时间】:2016-12-16 22:15:41
【问题描述】:
我有一个对象X 和一个方法getY() 返回一个对象Y 和一个方法a(),在打字稿中。
像这样的表达是什么意思:
X.getY()!.a()
我猜! 运算符用于检查null,但它具体是如何工作的呢?语言在哪里定义的?
【问题讨论】:
标签: object typescript operators
我有一个对象X 和一个方法getY() 返回一个对象Y 和一个方法a(),在打字稿中。
像这样的表达是什么意思:
X.getY()!.a()
我猜! 运算符用于检查null,但它具体是如何工作的呢?语言在哪里定义的?
【问题讨论】:
标签: object typescript operators
它被称为“非空断言运算符”,它告诉编译器x.getY() 不为空。
这是一个新的 typescript 2.0 功能,您可以在 what's new 页面中阅读它,它是这样说的:
一个新的!后缀表达式运算符可用于断言其 操作数在类型为非空且非未定义的上下文中 checker 无法得出这一事实。具体来说,操作 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 (!)
【讨论】:
e && e.name 几千次。谢谢
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 已经非常擅长推断类型,例如使用类型保护:
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')
}
}
我的个人建议是尽可能避免使用此运算符。让编译器完成静态检查代码的工作。但是,在某些情况下,尤其是在供应商代码中,使用此运算符是不可避免的。
【讨论】: