什么是鴨子打字?
首先,我們要知道什么是鴨子打字。根據程序員的說法,對象的類型由其行為(如方法和屬性)而不是其類決定的情況稱為“鴨子類型”。
TypeScript 中的鴨子類型
TypeScript 中接口的使用使鴨子打字成為可能。其中接口意味著描述對象必須屬于該類型的一組方法和特征。
例如,如果接口定義了函數,則任何具有名為“myFunc()”方法的對象都可以被視為屬于特定類型,而不管其類如何。當兩個對象共享相同的行為并且可以互換使用時,可以實現更大的代碼靈活性。
鴨子類型強調通過考慮對象的方法和屬性而不是其實際類型來評估對象對任務的適用性。接口解釋了出于特定目的,對象必須被視為“鴨子類型”的一組屬性和方法。
鴨子類型的好處
鴨子類型的主要好處之一是使代碼更加靈活和可重用。該代碼適用于具有所需方法和屬性的任何對象,而不僅僅是特定類型的對象,并且可以在各種情況下使用而無需修改。鴨子類型還通過在單個代碼庫中實現不同類型的對象的可互換使用來提高代碼重用。
鴨子打字的示例是 TypeScript
以下是如何在 TypeScript 中使用鴨子類型的示例 –
定義一個接口來表示您希望對象具有的行為。例如 –
interface Duck { quack(): void; }
登錄后復制
創建一個實現該接口的類。例如 –
class MallardDuck implements Duck { quack(): void { console.log("Quack!"); } }
登錄后復制
創建該類的實例并將其用作接口定義的類型。
let duck: Duck = new MallardDuck(); duck.quack(); // Output: "Quack!"
登錄后復制
創建另一個也實現該接口的類 –
class RubberDuck implements Duck { quack(): void { console.log("Squeak!"); } }
登錄后復制
使用新的類實例作為接口定義的相同類型。
let duck: Duck = new RubberDuck(); duck.quack(); // Output: "Squeak!"
登錄后復制
正如您所看到的,MallardDuck 和 RubberDuck 類都實現了 Duck 接口,并且 duck 變量可以分配給這兩個類的實例。類型由接口而不是類中定義的行為(方法和屬性)決定。
還需要注意的是,在 TypeScript 中,您可以使用 typeof 關鍵字來檢查運行時對象的類型以及該對象是否具有預期的方法或屬性。
示例
在此示例中,Bird 和 Plane 類實現了 Flyable 接口,該接口需要 Fly() 方法。兩種“鴨子類型”可以在 goFly() 函數中互換使用。該函數并不關心傳遞給它的對象的實際類型,只要它有一個可以調用的fly()方法即可。
interface Flyable { fly(): void; } class Bird implements Flyable { fly(): void { console.log("Bird is flying"); } } class Plane implements Flyable { fly(): void { console.log("Plane is flying"); } } function goFly(flyable: Flyable) { flyable.fly(); } let bird = new Bird(); let plane = new Plane(); goFly(bird); // Prints "Bird is flying" goFly(plane); // Prints "Plane is flying"
登錄后復制
編譯時,它將生成以下 JavaScript 代碼 –
var Bird = /** @class */ (function () { function Bird() { } Bird.prototype.fly = function () { console.log("Bird is flying"); }; return Bird; }()); var Plane = /** @class */ (function () { function Plane() { } Plane.prototype.fly = function () { console.log("Plane is flying"); }; return Plane; }()); function goFly(flyable) { flyable.fly(); } var bird = new Bird(); var plane = new Plane(); goFly(bird); // Prints "Bird is flying" goFly(plane); // Prints "Plane is flying"
登錄后復制
輸出
上面的代碼將產生以下輸出 –
Bird is flying Plane is flying
登錄后復制
示例
總的來說,鴨子類型是一個強大的編程概念,它允許不同類型的對象互換使用,只要它們具有相同的方法和屬性,從而在 TypeScript 代碼中提供更大的靈活性和可重用性。在此示例中,Driveable 接口、Car 和 Truck 類顯示相同的內容。
interface Driveable { drive(): void; } class Car implements Driveable { drive(): void { console.log("Car is driving"); } } class Truck implements Driveable { drive(): void { console.log("Truck is driving"); } } function goDrive(driveable: Driveable) { driveable.drive(); } let car = new Car(); let truck = new Truck(); goDrive(car); // Prints "Car is driving" goDrive(truck); // Prints "Truck is driving"
登錄后復制
編譯時,它將生成以下 JavaScript 代碼 –
var Car = /** @class */ (function () { function Car() { } Car.prototype.drive = function () { console.log("Car is driving"); }; return Car; }()); var Truck = /** @class */ (function () { function Truck() { } Truck.prototype.drive = function () { console.log("Truck is driving"); }; return Truck; }()); function goDrive(driveable) { driveable.drive(); } var car = new Car(); var truck = new Truck(); goDrive(car); // Prints "Car is driving" goDrive(truck); // Prints "Truck is driving"
登錄后復制
輸出
上面的代碼將產生以下輸出 –
Car is driving Truck is driving
登錄后復制
鴨子類型背后的主要思想是,代碼應該編寫為與任何具有所需方法和屬性的對象一起使用,而不是編寫為與特定對象一起使用。這可以使代碼更加靈活和可重用,允許您在不更改代碼的情況下互換使用不同類型的對象。
以上就是TypeScript 中的 Duck 類型的詳細內容,更多請關注www.92cms.cn其它相關文章!