typestar

Tipado estructural en TypeScript

La compatibilidad es cuestión de forma, no de nombres ni de ascendencia.

interface Named {
  name: string;
}

class Person {
  constructor(public name: string, public age: number) {}
}

function greet(named: Named): string {
  return `hello ${named.name}`;
}

console.log(greet(new Person("ada", 36)));
console.log(greet({ name: "grace", extra: true } as Named));

type UserId = string & { readonly brand: unique symbol };

function makeUserId(raw: string): UserId {
  return raw as UserId;
}

function load(id: UserId): string {
  return `loading ${id}`;
}

console.log(load(makeUserId("u-1")));
// load("u-1"); // error: una cadena simple no es un UserId

Cómo funciona

  1. Cualquier cosa con los miembros correctos encaja, incluso de otro archivo.
  2. Los miembros extra no molestan, salvo en un literal recién creado.
  3. Un tipo marcado (branded) es cómo recuperas el comportamiento nominal.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
27
Caracteres a escribir
573
Tokens
145
Ritmo de tres estrellas
95 tpm

Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 92 segundos.

Escribe este fragmento

Paso 4 de 5 en Objetos e interfaces; paso 14 de 23 en Tipos y anotaciones.

← Anterior Siguiente →