Búsqueda de sitios web

angularjs - Typescript: ¿crear un tipo que extienda de un tipo primitivo?


En mi proyecto de Angular, quiero crear un tipo personalizado que extienda de string. Mi caso es que quiero crear un tipo "ID" para separar string de idstring.

let str = String("tutu");
let id = ID("ec1s69azs");

this.service.getUserById(str) => doesn't compile;
this.service.getUserById(id) => compile;

En el futuro, puede que quiera agregar un validador de identificación en el tipo "ID"

Me preguntaba si es posible porque he probado muchos "trucos" pero ninguno me da el resultado que quiero.

class ObjectID extends String {
}


export type ID = ObjectID;

o

interface StringConstructor {
  new(value?: any): String;
  (value?: any): string;
  readonly prototype: String;
  fromCharCode(...codes: number[]): string;
}

export type ID = StringConstructor;

Respuesta #1

No pienses que necesitas extender string, puedes usar tipos marcados para lograr el resultado deseado.

type ObjectID =  string & { __type: 'Id'}
function ID(n: string): ObjectID{
    return n as any;
}


// Usage
function getUserById(id: ObjectID) {

}

getUserById(ID("1")); //ok
getUserById("1");  // error

Necesitas definir una función auxiliar para crear instancias del tipo o usar conversión de tipo, pero el sitio de llamada dará errores si pasas una cadena simple.

Este artículo tiene un poco más de discusión sobre el tema. Además, el compilador de TypeScript usa este enfoque para las rutas.