Escritura de pato TypeScript

En la programación de TypeScript , la función de escritura automática garantiza la seguridad de la escritura. Como resultado de la regla de escritura pato, el compilador de TypeScript verifica que dos objetos sean idénticos. 

La técnica de escritura pato en TypeScript se usa para comparar dos objetos al determinar si tienen las mismas propiedades de coincidencia de tipos y miembros de objetos o no. Por ejemplo, si asignamos un objeto con dos propiedades y un método y al segundo objeto solo se le asignan dos propiedades. El compilador de TypeScript genera un error de tiempo de compilación en tales situaciones cuando creamos una variable de object1 y le asignamos una variable del segundo tipo de objeto. Entendamos la suerte escribiendo con un ejemplo.

Ejemplo 1: en el siguiente código creamos tres clases: paloma, pingüino y búho. Las tres clases tienen una propiedad llamada «sonido». La clase Penguin tiene un método adicional llamado nadar. Cuando asignamos la variable búho a pingüino, no da ningún error ya que ambos tienen las mismas propiedades. Lo mismo ocurre cuando la paloma se asigna a la variable de tipo búho o cuando el objeto pingüino se asigna a la variable de tipo paloma. Pero no podemos asignar los objetos tipo paloma al pingüino ya que el pingüino tiene un método de clase adicional pero la paloma no.

Javascript

class Pigeon {
  sound = "coos";
}
  
class Owl {
  sound = "hoots";
}
  
class Penguin {
  sound = "peeps";
  swim() {
    console.log("I'm a bird and i can swim");
  }
}
  
let pigeon: Pigeon = new Owl();      // Works
let owl: Owl = new Pigeon();         // Works
let pigeon2: Pigeon = new Penguin(); // Works
let penguin: Penguin = new Pigeon(); // Compile time error
  
// Printing values
console.log("A pigeon " + pigeon.sound);
console.log("An owl " + owl.sound);
console.log("A pigeon " + pigeon2.sound);
console.log("A penguin " + penguin.sound);

Salida: cuando compilamos el archivo .ts obtenemos este error:

error TS2741: Falta la propiedad ‘nadar’ en el tipo ‘Paloma’ pero es necesaria en el tipo ‘Pingüino’.
let pingüino: Pingüino = new Paloma();

Cuando ejecutamos el archivo .js usando el comando:

node filename.js

Producción:

A pigeon hoots
An owl coos
A pigeon peeps
A penguin coos

Ejemplo 2: En este ejemplo, creamos dos clasesordinary_phone y iPhone. Este ejemplo es solo para tener una mejor comprensión. Tanto los teléfonos normales como los iPhone ayudan a los usuarios a llamar y enviar mensajes de texto; en el ejemplo, el iPhone tiene un método camera_experience(). Entonces, el iPhone tiene todas las funciones de un teléfono común y tiene una buena cámara. Por lo tanto, si creamos una variable de tipo iPhone y pasamos el objetoordinary_phone, funcionará, pero lo contrario no es posible ya queordinary_phone no consiste en el método camera_experience(). 

Javascript

class ordinary_phone {
  functions = ["calls", "messages"];
}
  
class iphone {
  functions = ["calls", "messages"];
  camera_experience() {
    console.log("i am very well known for my camera");
  }
}
  
let phone1: ordinary_phone = new iphone();
  
console.log(phone1.functions);
console.log(phone1.camera_experience());
  
let phone2: iphone = new ordinary_phone();

Salida: después de compilar el archivo .ts obtenemos este error:

error TS2339: la propiedad ‘camera_experience’ no existe en el tipo ‘ordinary_phone’.
consola.log(teléfono1.camera_experience());
~~~~~~~~~~~~~~~~~
one.ts:427:5 – error TS2741: Falta la propiedad ‘camera_experience’ en el tipo ‘ordinary_phone’
pero se requiere en el tipo ‘iphone’.
let phone2: iphone = newordinary_phone();
~~~~~~
one.ts:419:3
camera_experience() {
~~~~~~~~~~~~~~~~~~
‘camera_experience’ se declara aquí.

Cuando ejecutamos el archivo .js usando el comando:

node filename.js

Producción:

[ 'calls', 'messages' ]
i am very well known for my camera
undefined

Referencia: https://www.typescriptlang.org/docs/handbook/interfaces.html

Publicación traducida automáticamente

Artículo escrito por sarahjane3102 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *