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.
