Typescript: Lägg till en egenskap på ett inre objekt med modulaugumentering


Med tanke på ett externt (npm) modul extmod som exponerar följande gränssnitt i dess deklarationsfil:

interface Options {
  somevar?: string;
  suboptions?: {
    somesubvar?: string;
  };
}

Hur kan jag lägga till en egenskap somesubvar2 inom suboptions med modulutökning?

Jag har försökt följande i en extmod.d.ts-fil:

declare module 'extmod' {
  interface Options {
    suboptions?: {
      somesubvar2?: string;
    };
  }
}

Men det kastar följande fel:

error TS2687: All declarations of 'suboptions' must have identical modifiers.
error TS2717: Subsequent property declarations must have the same type.  Property 'suboptions' must be of type '<SNIP>', but here has type '{ somesubvar2: string; }'.

Svar #1

Det här kunde antagligen ha gjorts bättre, gjorts tillgängligt globalt med hjälp av omgivande deklarationer, men det gör fortfarande jobbet.

import Web3 from 'web3'
import type { Contract as TheBadContract } from 'xyz'

interface ContractMethods {
  // some properties...
}

interface Contract extends Modify<TheBadContract, {
  methods: ContractMethods // <- this `methods` is the actual overwritten property
}> {}

const contract: Contract = new web3.eth.Contract()

Detta var enkelt eftersom methods-objektet var en omedelbar medlem och det är undefined på den ursprungliga Contract-typen.

Om du faktiskt behöver ändra någon djupt nästlad nyckel, kolla in min ModifyDeep-typ nedan.

Ändra: https://stackoverflow.com/a/55032655/985454
ÄndraDjupt: https://stackoverflow.com/a/65561287/985454

Svar #2

Hur kan jag lägga till en egenskap somesubvar2 inuti suboptions med modulförstärkning?

I ditt exempel ändrade du typen suboptions från <SNIP> till { somesubvar2: string; }

Du kan patcha <SNIP>-typen med ytterligare egenskap.

Relaterade artiklar