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
- Cualquier cosa con los miembros correctos encaja, incluso de otro archivo.
- Los miembros extra no molestan, salvo en un literal recién creado.
- Un tipo marcado (branded) es cómo recuperas el comportamiento nominal.
Palabras clave y builtins usados aquí
NamedUserIdasclassconstructorfunctioninterfacenumberpublicreadonlyreturnstringtruetypeunique
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.
Paso 4 de 5 en Objetos e interfaces; paso 14 de 23 en Tipos y anotaciones.