typescript - TS märkt sträng som nyckel i objektet


Föreställ dig att jag har klassen Foo med strängidentifierare.

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

Jag försöker säkerställa statisk typning av det med en varumärkesenum.

enum FooIdBranding {}
type FooId = string & FooIdBranding;

Så nu är mitt mål ett specifikt objekt, där nyckeln är FooId och värdet är Foo.

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

Tyvärr fungerar det inte:

TS1023: En indexsignaturparameter typ måste vara 'string' eller 'number'

Jag trodde att skivan är min lösning, men den fungerar inte heller.

type FooCache = Record<FooId, Foo>;

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

TS 7017: Element har implicit typen 'any' eftersom typen Record<FooId, Foo> inte har någon indexsignatur

Finns det ett korrekt sätt i TypeScript att lösa detta problem?

Svar #1

"Symbol- och mallsträngsmönsterindexsignaturer" lades till i TypeScript 4.4, så detta är nu möjligt.

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)
}

Exempel i TS-lekplatsen.

Relaterade artiklar