3.7リリース活字体、このバージョンでは、多くの新機能をもたらします。
オプションの連鎖
まず、ハイライトの一つは、オプションのチェーンで、このコミュニティは、特に強いコールのECMAScriptプロパティです。もともとそれが問題追跡システム16の問題最初の活字体だった、23 000問題までの合計が現在存在していることを知って、5年前に提出しました。その時TC39で正式な提案、年間の開発者がこの機能を達成するために必要とされてきたが、勧告を矛盾ないECMAScriptのために、達成するためにまだ持って、逆TSの開発チームは、標準化し、最終的にプッシュする案を推進しに尽力してきたし、すべてのJavaScriptと活字体の開発者。
オプションの連鎖機能は主にプロパティがパスnullとundefined値で表示され保護するために使用され、C#や他の言語はどこにでもオブジェクト階層プロセスのヌルと遭遇した未定義の状態で、プロパティチェーンにアクセスするための糖衣構文を持っているように、あなたは、通常行うことができ、エラーをスローしません。
具体的には、ツリー構造の深さまでプロパティ値アクセスは、中間ノードは、一般的に存在するかどうかをチェックする必要があります。
var street = user.address && user.address.street;
多くのオブジェクトまたはAPIは、未定義のヌルを/返し、結果がnullでない場合、結果から抽出属性にしたいかもしれません。
var fooInput = myForm.querySelector('input[name=foo]')
var fooValue = fooInput ? fooInput.value : undefined
オプションチェーン演算子は、繰り返し動作を実行することなく、開発者が直接、簡単な方法で状況に対処することを可能にする、または一時変数の使用は、中間結果を割り当てられます。
var street = user.address?.street
var fooValue = myForm.querySelector('input[name=foo]')?.value
それが財産保護チェーンにアクセスする際のオプションチェーン演算子はまた、「安全運航事業者」と呼ばれているので、オペレータは、TC39の標準与えられている「?。」nullで、未定義なので、その構文は3つのシナリオに適用することができ:
obj?.prop // 自判断静态属性访问
obj?.[expr] // 自判断动态访问
func?.(...args) // 自判断函数或方法调用
合わせた解析ヌル(Nullish合体)
非常に近いオプションのチェーン機能へのもう一つは、ヌル判定合併(Nullish合体)は、??また、今後のECMAScriptプロパティで特定のNullish合体演算子、で有効になっています。
次のコードを考えてみます。
let x = (foo !== null && foo !== undefined) ?
foo :
bar();
fooが空でなく不定、実行バーに等しくない場合()。それは今と同等です。
let x = foo ?? bar();
断言
事故が発生した場合には、機能の特定のセットがあり、エラーがスローされます、これは、アサーションとして知られています。特殊な例のNode.jsのassert関数があります:
assert(someValue === 42);
someValueのは42に等しくない場合、アサートがAssertionErrorがスローされます。
JavaScriptのは、一般的に導入アサーションを防ぐために使用され、たとえば、正しいタイプではありません。
function multiply(x, y) {
assert(typeof x === "number");
assert(typeof y === "number");
return x * y;
}
しかし、活字体で、問題のいくつかの種類が存在します。
function yell(str) {
assert(typeof str === "string");
return str.toUppercase();
// Oops! We misspelled 'toUpperCase'.
// Would be great if TypeScript still caught this!
}
代替言語を解析することができるように、コードを書き換えることであるが、これは非常に便利ではありません。
function yell(str) {
if (typeof str !== "string") {
throw new TypeError("str should have been a string.")
}
// Error caught!
return str.toUppercase();
}
活字体は、これらのアサーション機能をモデル化することができ活字体3.7が導入ので、「アサーション署名」と呼ばれる新しい概念をJavaScriptを既存の構造を維持するための破壊的な方法を最小限にしたいです。
最初の主張は、それが範囲の残りの部分、条件チェックが真でなければならない何に関係なく含まれていることを確実にするために、モデリングASSERT実装のNode.jsに署名します。
function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new AssertionError(msg)
}
}
アサートが返された場合、任意のコンテンツ条件パラメータに渡されたことをアサート条件は、範囲の残りのために、条件が真でなければならないことをその手段、(それ以外の場合はエラーにつながる)trueにする必要があります。
前縁が例えば叫ぶ、実際にエラーの種類をキャプチャすることができます。
function yell(str) {
assert(typeof str === "string");
return str.toUppercase();
// ~~~~~~~~~~~
// error: Property 'toUppercase' does not exist on type 'string'.
// Did you mean 'toUpperCase'?
}
function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new AssertionError(msg)
}
}
別のアサーションの署名は条件をチェックしませんが、異なる種類の活字体の特定の変数または属性を伝えるために。
function assertIsString(val: any): asserts val is string {
if (typeof val !== "string") {
throw new AssertionError("Not a string!");
}
}
ここでアサートValで文字列を、すべての呼び出し後assertIsStringに確認して、渡されたすべての変数は文字列になります。
function yell(str: any) {
assertIsString(str);
// Now TypeScript knows that 'str' is a 'string'.
return str.toUppercase();
// ~~~~~~~~~~~
// error: Property 'toUppercase' does not exist on type 'string'.
// Did you mean 'toUpperCase'?
}
これらのアサーションの署名書かれた署名は、述語の種類と非常によく似ています:
function isString(val: any): val is string {
return typeof val === "string";
}
function yell(str: any) {
if (isString(str)) {
return str.toUppercase();
}
throw "Oops!";
}
述語署名同様のタイプは、これらのアサーションの署名にも強い表現力を持っている、あなたはこれらのいくつかのかなり複雑なロジックを表現使用することができます。
function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {
if (val === undefined || val === null) {
throw new AssertionError(
`Expected 'val' to be defined, but received ${val}`
);
}
}
その他の新機能および機能拡張もありますが、ビューの更新について詳しく説明します。
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7
また、アップデートの一環として、すべての新機能を体験することができ遊び場(遊び場)がある公式サイトを活字体:
https://www.typescriptlang.org/play/index.html?#show-whatisnew