Búsqueda de sitios web

TypeScript - cadena con marca TS como clave del objeto


Imagina que tengo la clase Foo con un identificador de cadena.

class Foo {
    id = '123' as FooId;
}

Intento asegurar la tipificación estática de esto usando un enum de marcas.

enum FooIdBranding {}
type FooId = string & FooIdBranding;

Entonces ahora, mi objetivo es un objeto específico, donde la clave es FooId y el valor es Foo.

type fooCache = { [key: FooId]: Foo };

Desafortunadamente, no funciona:

TS1023: El tipo de parámetro de una firma de índice debe ser 'string' o 'number'

Pensé que el Registro era mi solución, pero tampoco funciona.

type FooCache = Record<FooId, Foo>;

({} as FooCache)['123' as FooId] = new Foo();

TS 7017: El elemento tiene implícitamente un tipo 'any' porque el tipo Record<FooId, Foo> no tiene una firma de índice

¿Hay una manera correcta en TypeScript de resolver este problema?

Respuesta #1

"Se añadieron 'Symbol and Template String Pattern Index Signatures' a TypeScript 4.4, por lo que esto ahora es posible."

type FooId = string & {brand: 'FooId'};
const id1 = '1' as FooId
const id2 = '2' as FooId

class Foo {
  constructor(public id: FooId) {}
}

type fooCache = { [key: FooId]: Foo };

const foo: fooCache = {
  // Type '{ key: Foo; }' is not assignable to type 'fooCache'.
  // Object literal may only specify known properties, and 'key' does not exist in type 'fooCache'.(2322)
  // (property) key: Foo
  key: new Foo(id1)
}

// All good
const bar: fooCache = {
  [id1]: new Foo(id1)
}

Ejemplo en el playground de TS.

Artículos relacionados