Ejemplo
const food = { fruit: ['apples', 'oranges'], meat: ['chicken', 'pig'] } function makeFood(ingredient, category) { switch(true) { case category === 'fruit' && ingredient === 'apples' { // do something } case category === 'fruit' && ingredient === 'oranges' { // do something } case category === 'meat' && ingredient === 'chicken' { // do something } case category === 'meat' && ingredient === 'pig' { // do something } } }¿Cuál es la mejor manera de escribir categoría es una clave de alimento e ingrediente es un valor?
Actualmente estoy haciendo
function(ingredient, keyof typeof category) {Me encantaría mantener la relación entre los dos. Entonces TS sabrá el tipo de ingrediente basado en el valor de la categoría.
Utiliza Generics mecanografiados. En esto, quería que la category fuera un parámetro genérico, qué ingrediente puede usar.
Deberá usar as const (ver aquí ) en su objeto de origen para asegurarse de que su cadena específica sea parte de su tipo.
const food = { fruit: ['apples', 'oranges'], meat: ['chicken', 'pig'] } as const // important to add "as const" here function makeFood< K extends keyof typeof food // Generic parameter >( ingredient: typeof food[K][number], // use K to lookup types for ingredient category: K // provide the key to to use here as K ) { switch(true) { case category === 'fruit' && ingredient === 'apples': { // do something } case category === 'fruit' && ingredient === 'oranges': { // do something } case category === 'meat' && ingredient === 'chicken': { // do something } case category === 'meat' && ingredient === 'pig': { // do something } } } makeFood('apples', 'fruit') makeFood('pig', 'fruit') // type error