typescript - Objekttypning där värdet är en array av nycklar eller en tom array


Jag vill skriva ett objekt som detta:

const example = {
  'meow': [],
  'woof': [],
  'quack': [],
  'all': ['meow', 'woof', 'quack'],
  'meowWoof': ['meow', 'woof'],
}

Ovan skulle vara giltigt. Du ser att det är meta eftersom värdena måste vara arrayer vars värden är nycklar i själva objektet.

Men detta skulle inte ske eftersom DOGS inte är en nyckel.

const example = {
  'meow': [],
  'woof': [],
  'quack': [],
  'all': ['meow', 'DOGS', 'quack'],
  'meowWoof': ['meow', 'woof'],
}

Jag skulle vara okej med att omsluta det här objektet i en funktion för att få typningen att fungera.

Är detta möjligt?

Svar #1

Jag skulle använda en generell hjälpfunktion som denna:

const asExample = <T extends Record<keyof T, Array<keyof T>>>(t: T) => t;

Det beter sig som du verkar vilja att det ska:

const example = asExample({
    'meow': [],
    'woof': [],
    'quack': [],
    'all': ['meow', 'woof', 'quack'],
    'meowWoof': ['meow', 'woof'],
}); // okay

const badExample = asExample({
    'meow': [],
    'woof': [],
    'quack': [],
    'all': ['meow', 'DOGS', 'quack'],  // error here
    'meowWoof': ['meow', 'woof'],
});

Hoppas det hjälper. Lycka till!

Länk till kod