Typescript目前(或计划)是否支持安全导航操作符?。
ie:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
Typescript目前(或计划)是否支持安全导航操作符?。
ie:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
此外,这个操作符是否有更常见的名称(很难为谷歌)。
当前回答
猫王(? ?)可选的链接操作符在TypeScript 3.7中被支持。
你可以用它来检查空值:cats?如果cats为null或未定义,Miows将返回null。
你也可以将它用于可选方法调用:cats.doMiow?(5)将调用doMiow如果它存在。
属性访问也是可能的:猫?.['喵']。
参考:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
其他回答
更新:是的,现在支持了!
它刚刚与TypeScript 3.7一起发布:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
它被称为可选链接:https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
有以下内容:
let x = foo?.bar.baz();
等价于:
let x = (foo === null || foo === undefined) ?
undefined :
foo.bar.baz();
旧的答案
在github上有一个开放的功能请求,你可以在那里发表你的意见/愿望:https://github.com/Microsoft/TypeScript/issues/16
现在可以了,请看用户“甜甜圈”的回答。
旧的回答: 关于布尔运算符的标准JavaScript行为可能会有所帮助。布尔方法在比较对象时不返回true或false,但在or情况下,第一个值等于true。
虽然不如单身好,但还是管用的:
var thing = foo && foo.bar || null;
你可以随心所欲地使用&&:
var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;
也可以使用默认值:
var name = person && person.name || "Unknown user";
操作员吗?。在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;
}
用法是这样的:
o(o(o(test).prop1).prop2
另外,你可以设置一个默认值:
o(o(o(o(test).prop1).prop2, "none")
它与Visual Studio中的智能感知一起工作得非常好。
这是在ECMAScript可选链接规范中定义的,所以在讨论这个问题时,我们可能应该参考可选链接。可能实现:
const result = a?.b?.c;
从长期和短期来看,TypeScript团队正在等待ECMAScript规范的收紧,这样他们的实现就可以在未来不中断。如果他们现在实现了一些东西,如果ECMAScript重新定义了他们的规范,那么最终需要进行重大更改。
参见可选连接规范
如果有些东西永远不会成为标准JavaScript, TypeScript团队可以按照他们认为合适的方式实现,但对于未来的ECMAScript添加,他们希望保留语义,即使他们提供早期访问,就像他们对许多其他特性一样。
捷径
所以JavaScripts所有时髦的操作符都是可用的,包括类型转换,比如…
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
手动解决方案
回到问题上来。我有一个愚蠢的例子,说明如何在JavaScript(以及TypeScript)中做类似的事情,尽管我绝对不是说它是你真正追求的一个优雅的特性。
(foo||{}).bar;
如果foo未定义,结果也未定义如果foo有定义并且有一个名为bar的属性,它有一个值,结果就是那个值。
我在JSFiddle上放了一个例子。
对于更长的例子来说,这看起来很粗略。
var postCode = ((person||{}).address||{}).postcode;
链函数
如果您迫切需要一个更短的版本,而规范仍然悬而未决,我在某些情况下使用这种方法。它计算表达式,并在链不能满足或最终为null/undefined时返回默认值(注意!=在这里很重要,我们不想使用!==,因为我们在这里想要一些正的杂耍)。
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'));
它叫做可选链接,在Typescript 3.7中
可选的链接让我们可以在可以立即停止的地方编写代码 如果遇到null或undefined,运行一些表达式