typescript - Indexsignatur för typ 'string' saknas i typ./KändaNycklar


Jag försöker aktivera strict i applikationen och jag hade gränssnitt som såg ungefär ut så här:

interface Item {
  id: string;
  archivedAt: Date | string;
  secondItem: SecondItem
}

interface SecondItem {
  name: string;
  content: string;
}

Mitt problem var att när jag skapade ett nytt objekt av typen Item med extra värden, borde payloaden skapas. T.ex.

data['someOtherKey'] = 'someOtherValue';

const item = new ItemCreatedPayload(data); // this should not throw, further description below

Istället fick jag följande fel: Elementet har implicit typen 'any' eftersom uttrycket av typen '"someOtherKey"' inte kan användas för att indexera typen Item

Jag lyckades lösa detta genom att refaktorera gränssnittet:

interface Item {
  id: string;
  archivedAt: Date | string;
  secondItem: SecondItem;
  [key: string]: unknown;
}

Här är min första fråga: finns det ett annat sätt att uppnå detta?

Det här fungerar bra i tester, men ger fel i själva appen. Så här används det:

export class ItemCreatedPayload {
  constructor(
    public readonly item: Item,
  ) {
    const schema = Joi.object({ item: ItemCreatedSchema.required() });
    const { error } = schema.validate({ item }, { allowUnknown: true });

    if (error) {
      throw error;
    }
  }
}

Då skickar jag händelsen via nats-mikrotjänst

this.events.emitItemCreatedEvent(new ItemCreatedPayload(item));

Och jag får detta fel: Index-signatur för typen 'string' saknas i typen 'item'.

Jag lyckades också kringgå detta genom att använda typen KnownKeys:

type KnownKeys<T> = {
  [K in keyof T]: string extends K ? never : number extends K ? never : K;
} extends { [_ in keyof T]: infer U }
  ? U
  : never;

Så här:

export class ItemCreatedPayload {
  constructor(
    public readonly item: Pick<Item, KnownKeys<Item>>,
  ) {
    const schema = Joi.object({ item: ItemCreatedSchema.required() });
    const { error } = schema.validate({ item }, { allowUnknown: true });

    if (error) {
      throw error;
    }
  }
}

Detta löser Index signature for type 'string' is missing in type 'Item'.-problemet, men introducerar ett nytt. Nu i händelsehanteraren kan jag inte komma åt några item-egenskaper

  @EventPattern(EventName.ItemCreated)
  public async handleItemCreated(data: ItemCreatedPayload): Promise<void> {
    await this.items.findOrCreate({
      where: { id: data.item.id },
    });
  }

Fel:
Egenskapen 'id' finns inte på typen 'Pick'.

Nu för den andra och sista frågan. Vet någon vilken typ som borde vara här för att bli av med Index signature for type 'string' is missing in type 'item'. och Property 'id' does not exist on type 'Pick'. fel? Jag kan inte fixa båda samtidigt.

export class ItemCreatedPayload {
  constructor(
    public readonly item: ???????????,
  ) {
    const schema = Joi.object({ item: ItemCreatedSchema.required() });
    const { error } = schema.validate({ item }, { allowUnknown: true });

    if (error) {
      throw error;
    }
  }
}

Jag är medveten om att efter TypeScript 4.3.0 är KnownKeys-typen alltid never och jag har försökt varje svar i denna tråd utan framgång.

Det är svårt att på ett sammanhängande sätt representera detta problem i lekplatsen, men här är det

Hur som helst, tack för din tid. All feedback skulle uppskattas.

Relaterade artiklar