:「Type Script中国語入門教程」11、声明合併

8256 ワード

著作権
記事の転載先:https://github.com/zhongsp
上のURLに直接ジャンプして最新バージョンを見ることをお勧めします.
紹介する
Type Scriptにはいくつかの独特な概念があります.JavaScriptのトップオブジェクトのタイプについて説明したいからです.このうちの一つは という.この概念を理解しました.Type Scriptを使って既存のJavaScriptを操作するのに大変役立ちます.同時に、より高度で抽象的な概念の理解にも役立つ.
まず、どのように声明を統合するかを知る前に、 とは何かを先に見てみましょう.
このマニュアルでは、声明の統合とは、コンパイラが同じ名前の二つの声明を別々の声明に統合することを意味します.統合後の声明は、同時にその二つの統合された声明の特性を有する.声明の合併は二つの合併に限らず、任意の数量でも大丈夫です.
基本概念
Typeescriptの声明は、名前空間、タイプまたは値の三つのエンティティの一つを作成します.名前空間を作成するための声明には、記号でアクセスできる名前が含まれています.ステートメントの種類を作成するには、与えられた名前と構造でタイプを作成します.最後に、値を作成する宣言は、生成されたJavaScriptで見られる部分です.
Declaration Type
Namespace
Type
Value
Namespace
X
 
X
クラス
 
X
X
インターフェース
 
X
 
Function
 
 
X
Varable
 
 
X
各声明が何を作成したかを理解することは、声明が合併された時に何が合併されたかを理解するのに役立ちます.
各声明がどのように対応して作成されるかを理解することは、声明の統合を行う場合に役立ちます.
インターフェースを結合
最も簡単で一般的なのは結合インターフェースです.合併を宣言する種類はインターフェース結合です.根本的には、統合のメカニズムは、同じ名前の単一のインターフェースにそれぞれの声明のメンバーを入れることです.
interface Box { height: number; width: number; } interface Box { scale: number; } var box: Box = {height: 5, width: 6, scale: 10}; 
インターフェース内の非関数のメンバーは一意でなければならない.複数のインターフェースで同じ名前の非関数メンバーがいるとエラーが発生します.
関数のメンバーについては、同じ名前の関数宣言は、この関数の重荷として扱われます.
なお、インターフェースAがその後ろのインターフェースA(このインターフェースをA'と呼ぶ)と結合すると、A′における負荷関数はより高い優先度を持つ.
次の例に示します
interface Document { createElement(tagName: any): Element; } interface Document { createElement(tagName: string): HTMLElement; } interface Document { createElement(tagName: "div"): HTMLDivElement; createElement(tagName: "span"): HTMLSpanElement; createElement(tagName: "canvas"): HTMLCanvasElement; } 
この3つのインターフェースを結合して声明にします.各インターフェースの声明の順序は変わらないように注意してください.後のインターフェースだけが前のインターフェース宣言の前に現れます.
interface Document { createElement(tagName: "div"): HTMLDivElement; createElement(tagName: "span"): HTMLSpanElement; createElement(tagName: "canvas"): HTMLCanvasElement; createElement(tagName: string): HTMLElement; createElement(tagName: any): Element; } 
名前空間をマージ
インターフェースと似ていますが、同名の名前空間もメンバーを統合します.名前空間は名前空間と値を作成します.この両方がどのように結合されているかを知る必要があります.
名前空間の統合は、モジュールから導出された同名のインターフェースを統合し、単一名前空間内に統合されたインターフェースが含まれている.
値のマージは、現在名前が与えられている名前空間が存在する場合、後に名前空間の導出メンバーが既に存在するモジュールに追加されます.Animalsは、統合例を宣言する.
namespace Animals {
    export class Zebra { } } namespace Animals { export interface Legged { numberOfLegs: number; } export class Dog { } } 
等しい:
namespace Animals {
    export interface Legged { numberOfLegs: number; } export class Zebra { } export class Dog { } } 
これらの合併以外に、メンバーをエクスポートしない場合はどのように処理されますか?非エクスポートメンバーは、元の名前空間(非マージ)内にのみ表示されます.つまり、統合後、他の名前空間からマージされたメンバーは、非エクスポートメンバーにアクセスできなくなりました.
以下の例は、より明確な説明を提供する.
namespace Animal {
    var haveMuscles = true; export function animalsHaveMuscles() { return haveMuscles; } } namespace Animal { export function doAnimalsHaveMuscles() { return haveMuscles; // <-- error, haveMuscles is not visible here } } 
haveMusclesはエクスポートされていないので、animalsHaveMuscles関数だけが元のマージされていない名前空間を共有してこの変数にアクセスできる.  doAnimalsHaveMuscles関数は、名前空間を統合する一部であるが、エクスポートされていないメンバにはアクセスできない.
名前空間はクラスと関数と列挙の種類に結合されます.
名前空間は他のタイプの声明と統合できます.名前空間の定義が合うと、結合するタイプの定義が一致します.統合の結果には、両者の宣言の種類が含まれます.Typeescriptはこの機能を使ってJavaScriptの中のデザインを実現します.
まず、名前空間とクラスを統合してみます.これは内部クラスを定義することができます.
class Album { label: Album.AlbumLabel; } namespace Album { export class AlbumLabel { } } 
連結規則は上の 小節で述べた規則と一致しています.私たちはAlbumLabel類を導き出さなければなりません.統合の結果はクラスと内部クラスがあります.名前空間を使って、クラスのために静的な属性を増やすこともできます.
内部モード以外にも、JavaScriptで関数を作成して後で拡張します.属性を増やすこともよくあります.Typeescriptは声明を使って合併してこの目的を達成し、タイプの安全を保証します.
function buildLabel(name: string): string { return buildLabel.prefix + name + buildLabel.suffix; } namespace buildLabel { export var suffix = ""; export var prefix = "Hello, "; } alert(buildLabel("Sam Smith")); 
同様に、名前空間は列挙型を拡張するために使用できます.
enum Color { red = 1, green = 2, blue = 4 } namespace Color { export function mixColor(colorName: string) { if (colorName == "yellow") { return Color.red + Color.green; } else if (colorName == "white") { return Color.red + Color.green + Color.blue; } else if (colorName == "magenta") { return Color.red + Color.blue; } else if (colorName == "cyan") { return Color.green + Color.blue; } } } 
不法な合併
すべての合併が許されるわけではない.現在、クラスはクラスと結合できません.変数とタイプは結合できません.インターフェースとクラスは結合できません.模倣類の統合を望むなら、Mixins in Type Scriptを参照してください.