ステートメントのマージ
类型合并
2 つと同じステートメントを示し、後者は编译器
2つだけでなく、任意の数を組み合わせることができるという特徴があります。合并
分开
名称
合并
声明
声明
声明
两个
マージ インターフェイス
1. 1.interface
の非関数メンバーは一意である必要があります. 両方interface
が 1 つを宣言する名称相同但类型不同
と非函数成员
、编译器
エラーが表示されます:
interface Box {
height: number;
}
interface Box {
height: string;
}
复制代码
2. の場合函数成员
、それぞれのメンバーは相同名称
と見なされますが、クラス相同名称函数的重载
が 2 つある場合、前のものをオーバーライドします。interface
第二个有更高的优先
interface Cloner {
clone(animal: Animal): Animal;
}
interface Cloner {
clone(animal: Sheep): Sheep;
}
interface Cloner {
clone(animal: Dog): Dog;
clone(animal: Cat): Cat;
}
// 最终的排序是
interface Cloner {
clone(animal: Dog): Dog;
clone(animal: Cat): Cat;
clone(animal: Sheep): Sheep;
clone(animal: Animal): Animal;
}
复制代码
もちろん、この規則には例外があります。関数のパラメーターの型が单字面量类型
(単一の文字列リテラル型) の場合、次のように优先级排序
配置され声明顶部
ます。
interface Document {
createElement(tagName: any): Element;
}
interface Document {
createElement(tagName: 'div'): HTMLDivElement;
createElement(tagName: 'span'): HTMLSpanElement;
}
interface Document {
createElement(tagName: string): HTMLElement;
createElement(tagName: 'canvas'): HTMLCanvasElement;
}
// 字面量根据冒泡排序并放在了声明顶部
interface Document {
createElement(tagName: 'canvas'): HTMLCanvasElement;
createElement(tagName: 'div'): HTMLDivElement;
createElement(tagName: 'span'): HTMLSpanElement;
createElement(tagName: string): HTMLElement;
createElement(tagName: any): Element;
}
复制代码
名前空間のマージ
- 同名の 2 つをマージすると、1つ
namespace
目にさらに 2 つ目が追加さnamespace
れます。导出的成员
namespace
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
マージが発生すると、それとマージされたものはそれにnamesapce
アクセスできません未导出的成员
:
namespace Animal {
const haveMuscles = true;
export function animalsHaveMuscles() {
return haveMuscles;
}
}
namespace Animal {
export function doAnimalsHaveMuscles() {
return haveMuscles; // Error, because haveMuscles is not accessible here
}
}
复制代码
アクセスできない
haveMuscles
ことがわかります.同時に実行するとエラーが報告されます.コンパイルされた例と併せて見ることができます.
名前空間とクラス、列挙型、関数のマージ
- マージと同様
namespace
に、エクスポートされた合計class
は でアクセスできます。namespace
类型
值
class Album {
label: Album.AlbumLabel;
}
namespace Album {
export class AlbumLabel {}
}
复制代码
namespace
そしてfunction
マージはjavascript
、次のようにメソッドに属性を追加できます。
function buildLabel(name: string): string {
return buildLabel.prefix + name + buildLabel.suffix;
}
namespace buildLabel {
export const suffix = '';
export const prefix = 'Hello, ';
}
console.log(buildLabel('Sam Smith'));
复制代码
コンパイルされたコードを見るとbuildLabel
、属性が直接追加されていることがわかります。
namespace
enum
マージが発生すると、拡張namespace
できますenum
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;
}
}
}
复制代码
コンパイル後に次のことがわかります。
クラス間のマージは許可されていませんが、同様の機能を模倣する必要がある場合は、Typscripts の Mixinsを参照できます。
モジュール拡張
それらの間のマージはサポートされていませんが、必要なメソッドをModule
インポートしてから使用することで実装できます。扩展
更改
// observable.ts
export class Observable<T> {
// ... implementation left as an exercise for the reader ...
}
// map.ts
import { Observable } from "./observable";
Observable.prototype.map = function (f) {
// ... another exercise for the reader
};
复制代码
ただし、この方法ではコンパイラは適切なヒントを提供しないため、拡張module
宣言が必要です。
// observable.ts
export class Observable<T> {
// ... implementation left as an exercise for the reader ...
}
// map.ts
import { Observable } from "./observable";
declare module "./observable" {
interface Observable<T> {
map<U>(f: (x: T) => U): Observable<U>;
}
}
// 扩展声明
Observable.prototype.map = function (f) {
// ... another exercise for the reader
};
// consumer.ts
import { Observable } from "./observable";
import "./map";
let o: Observable<number>;
o.map((x) => x.toFixed());
复制代码
グローバル展開
モジュール内にある場合は、全局声明中
ここで拡張することもできます。
// observable.ts
export class Observable<T> {
// ... still no implementation ...
}
// 在这里扩展
declare global {
interface Array<T> {
toObservable(): Observable<T>;
}
}
Array.prototype.toObservable = function () {
// ...
};
复制代码
参照宣言のマージ