Mar*_*itt 255 typescript
Typescript目前(或有计划)支持安全导航操作员?.
即:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Run Code Online (Sandbox Code Playgroud)
此外,这个运营商有一个更常见的名称(它很难谷歌).
A. *_*K-R 133
不如单一的好吗?,但它的工作原理:
var thing = foo && foo.bar || null;
Run Code Online (Sandbox Code Playgroud)
您可以根据需要使用尽可能多的&&:
var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;
Run Code Online (Sandbox Code Playgroud)
Don*_*nut 99
我在TypeScript语言规范中找不到任何引用.
至于在CoffeeScript中调用此运算符的内容,它被称为存在运算符(具体地说,是存在运算符的"访问变量").
存在运算符的存取器变体
?.可用于在属性链中吸收空引用..在基值可能为null或未定义的情况下,使用它代替点访问器.
因此,存在运算符的存取器变体似乎是引用此运算符的正确方法; 而且TypeScript目前似乎不支持它(尽管其他人表达了对此功能的渴望).
Fen*_*ton 81
这在ECMAScript可选链接规范中定义,因此在讨论时我们应该参考可选链接.可能的实施:
const result = a?.b?.c;
Run Code Online (Sandbox Code Playgroud)
这个问题的长期和短期是TypeScript团队正在等待ECMAScript规范收紧,因此它们的实现在未来可能不会中断.如果他们现在实现了某些东西,那么如果ECMAScript重新定义他们的规范,最终将需要进行重大更改.
请参阅可选链接规范
在某些东西永远不会成为标准JavaScript的情况下,TypeScript团队可以按照自己的意愿实现,但是对于未来的ECMAScript添加,他们希望保留语义,即使它们提供早期访问,因为它们具有许多其他功能.
因此,所有JavaScripts时髦运算符都可用,包括类型转换,如...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
Run Code Online (Sandbox Code Playgroud)
但回到这个问题.我有一个很明显的例子,说明如何在JavaScript(以及TypeScript)中执行类似的操作,尽管我绝对不会建议它是一个优雅的,因为你真正追求的功能.
(foo||{}).bar;
Run Code Online (Sandbox Code Playgroud)
所以,如果foo是undefined的结果是undefined,如果foo被定义,并有一个名为财产bar具有价值,结果是该值.
我在JSFiddle上举了一个例子.
对于较长的例子,这看起来很粗略.
var postCode = ((person||{}).address||{}).postcode;
Run Code Online (Sandbox Code Playgroud)
如果您仍然急需一个较短的版本,而规格仍然悬而未决,我会在某些情况下使用这种方法.它计算表达式并返回默认值,如果链条不能满足或最终空/未定义(注意,!=在这里很重要,我们不希望使用!==,因为我们希望有点积极的杂耍这里).
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
Run Code Online (Sandbox Code Playgroud)
Jos*_*e A 28
编辑:感谢fracz评论,我已经更新了答案.
TypeScript 2.0发布?.它与!.(C#中的Safe Navigator)不一样
有关详细信息,请参阅此答案:
这只会告诉编译器该值不为null或未定义.这不会检查值是null还是未定义.
// 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
}
Run Code Online (Sandbox Code Playgroud)
sup*_*ary 11
TypeScript 3.7支持Elvis(?。)可选链接运算符。
您可以使用它来检查null值:cats?.miows如果cats为null或未定义,则返回null。
您也可以将其用于可选方法调用:cats.doMiow?.(5)如果存在,将调用doMiow。
也可以访问媒体资源:cats?.['miows']。
参考:https : //devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
Veg*_*ter 10
?.TypeScript 版本2.0不支持运算符.
所以我使用以下功能:
export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
if (typeof someObject === 'undefined' || someObject === null)
return defaultValue;
else
return someObject;
}
Run Code Online (Sandbox Code Playgroud)
用法如下:
o(o(o(test).prop1).prop2
Run Code Online (Sandbox Code Playgroud)
另外,您可以设置默认值:
o(o(o(o(test).prop1).prop2, "none")
Run Code Online (Sandbox Code Playgroud)
它在Visual Studio中与IntelliSense配合得非常好.
终于来了!
这里有一些例子:
// properties
foo?.bar
foo?.bar()
foo?.bar.baz()
foo?.bar?.baz()
// indexing
foo?.[0]
foo?.['bar']
// check if a function is defined before invoking
foo?.()
foo.bar?.()
foo?.bar?.()
Run Code Online (Sandbox Code Playgroud)
但这与您的假设并不完全相同。
而不是评估
foo?.bar
Run Code Online (Sandbox Code Playgroud)
对于这个我们都习惯于编写的小代码片段
foo ? foo.bar : null
Run Code Online (Sandbox Code Playgroud)
它实际上评估为
(foo === null || foo === undefined) ?
undefined :
foo.bar
Run Code Online (Sandbox Code Playgroud)
它适用于所有 falsey 值,如空字符串、0 或 false。
我只是没有解释为什么他们不编译它 foo == null
| 归档时间: |
|
| 查看次数: |
134573 次 |
| 最近记录: |