Vyhledávání na webu

javascript - Jak bezpečně deklarovat vnořené typy objektů v TypeScriptu


Chci vytvořit objekt, který obsahuje skupiny, a skupiny mají soubory. Vybratelné soubory mají rozhraní a chci dostat chybu, pokud skupina neobsahuje své soubory.

export interface Group_A_Files {
    'movie': string
    'image': string
    'other': string
}

export interface Group_B_Files {
    'image': string
}

export const groups = {
    'groupA'  : {
        'someField': 'some value',
        'files': <Group_A_Files> {
            'movie': '',
            'image': '',
        } // I want to get an error from the IDE, because other is required in Group_A_Files, but not set by me
    },
    'groupB'  : {
        'someField': 'some value',
        'files': <Group_B_Files>{
            'image': '',
            'bla':  ''
        } // I want to get an error from the IDE, because bla is not defined in Group_B_Files 
    }
}

Komentoval jsem, kde bych měl získat chybovou zprávu od IDE, ale nedostávám ji. Jaký je pro to správný postup?

Mám spoustu skupin a 5 typů souborů skupin. Tyto jsou konstanty a jsou pevně zakódované v aplikaci.

Nechci definovat celé skupiny v rozhraní a pak je také deklarovat, jen abych dostal chybová hlášení od IDE, rád bych typ definoval, když ho nastavím.

Tady je ukázka

Odpověď č. 1

Momentálně provádíte přetypování, místo toho chcete tvrdit typy, což lze udělat pomocí malé pomocné funkce:

  function <T> assert(el: T) { return el; }

Použitelné jako:

'groupB'  : {
    'someField': 'some value',
    'files': assert<Group_B_Files>({
        'image': '',
        'bla':  ''
    }),
}

Jinak byste mohl zadat celý objekt:

interface IGroups {
  groupA: {
    someField: string;
    files: Group_A_Files;
 }
};

export const groups: IGroups = {
    'groupA'  : {
        'someField': 'some value',
        'files': <Group_A_Files> {
            'movie': '',
            'image': '',
         }
    },
};