これはECMAScriptのオプションチェーン仕様で定義されているため、これについて説明するときには、オプションチェーンを参照する必要があります。ありそうな実装:
const result = a?.b?.c;
TypeScriptチームは、ECMAScript仕様が厳格化されるのをTypeScriptチームが待っているため、その実装は将来、非破壊的なものになる可能性があります。彼らが今何かを実装した場合、ECMAScriptが仕様を再定義すると、大きな変更が必要になります。
オプションの連鎖仕様を参照
TypeScriptチームは、標準のJavaScriptになることが決してない場合、適切と思われるように実装できますが、将来のECMAScriptの追加では、他の多くの機能と同様に、早期アクセスを許可してもセマンティクスを保持したいと考えています。
ショートカット
そのため、次のような型変換を含め、JavaScriptのすべてのファンキーな演算子を使用できます...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
手動による解決策
しかし、質問に戻ります。私がJavaScript(したがってTypeScript)で同様のことを行う方法の鈍い例がありますが、あなたが本当に望んでいる機能であるため、それが優雅であるとは絶対に示唆していません。
(foo||{}).bar;
その場合は、foo
あるundefined
結果であるundefined
と場合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'));