TypeScript-grensesnitt med betingede valgfrie parametere


Kan vi oppnå dette :

interface IMyInterface{
    firstname:string  // this means firstname is mandatory

    name:string  // this also means name is mandatory
}

Hvordan kan jeg si at enten firstname eller name er valgfri (?), avhengig av om den andre er oppgitt?

Eller hvis det ikke er mulig, hva er de andre alternativene?

REDIGER: Dette er ikke en duplikat av Typescript-grensesnittet - Er det mulig å gjøre 'enten eller' egenskaper obligatoriske?

Vi ønsker ikke å lage et eget grensesnitt for hvert eneste valgfrie element bare fordi vedlikeholdet, navngivningen og omstruktureringen vil være en stor byrde, og det er ikke gjenbrukbart.

Svar #1

Her er en generell måte å si «OneOf» disse nøklene på, du kan kanskje bruke den her:

type EachOfTmp<T> = {// to make OneOf less gross
  [K in Keys<T>]: {
    _: {[X in K]: T[K]};
  }
};

// require only one of the keys
export type OneOf<T> = EachOfTmp<T>[Keys<T>]["_"] & Partial<T>;

const thing1: OneOf<{ a: number; b: number }> = { a: 2 } // valid
const thing2: OneOf<{ a: number; b: number }> = { b: 2 } // valid
const thing3: OneOf<{ a: number; b: number }> = {} // invalid

REDIGER: oops, jeg glemte at jeg bruker denne bekvemmelighetsnøkkelavtalen -

export type Keys<T> = keyof T;
export function Keys<T>(o: T) {
  if (!o) {
    return [];
  }
  return Object.keys(o) as Keys<T>[];
}

Svar #2

En annen måte:

    interface IName {
        name:string 
    }

    interface IFirstName {
        firstname:string 
    }

    let x: IName | IFirstName;
    x = {}; // Error
    x = { name: "" }; // Ok
    x = { firstname: "" }; // Ok
    x = { name: "", firstname: "" }; // Ok

Relaterte artikler