Quiero declarar un tipo para una matriz que puede contener como máximo una de las siguientes cadenas: 'first' , 'second' , 'third' .
Algunos ejemplos válidos de cómo podría ser esa matriz:
[][ 'first' ][ 'first', 'second' ][ 'first', 'second', 'third' ][ 'first', 'third' ][ 'second', 'third' ]Algunas matrices no válidas:
[ 'other-value' ] // no se deben aceptar otros valores[ 'first', 'first' ] // no se aceptan duplicadosLos tipos que he escrito:
export enum MyOptions { first = 'first', second = 'second', third = 'third' } export type MyType = { name: string; email: string; listings: { MyOptions; }[]; };Tiene una advertencia que dice que el miembro 'MyOptions' implícitamente tiene un tipo 'cualquiera', pero se puede inferir un tipo mejor del uso .
Así que si se cambia a:
export type MyType = { name: string; email: string; listings: { options: MyOptions; }[]; }; Ahora, no hay advertencia, pero tiene ese valor de options adicionales que no creo que deba agregarse.
¿Alguna forma de arreglar esto?
Puede utilizar la estructura de datos Set .
export type Options = 'first' | 'second' | 'third' export type Listing = Set<Options> export type MyType = { name: string; email: string; listings: Listing; }; const myType = { name: 'name', email: 'email', listing: new Set(['first', 'second']) } Entonces estarás seguro de que no hay opciones repetidas en tu listado. Nota: en realidad, puede pasar opciones repetidas, pero Set las ignorará.
Creo que tienes un par extra de frenos que no necesitas.
export type MyType = { name: string; email: string; listings: { MyOptions; }[]; };debe ser cambiado a
export type MyType = { name: string; email: string; listings: MyOptions[]; };También tiene una opción más concisa: use tipos de cadenas literales:
export type MyType = { name: string; email: string; listings: ('first' | 'second' | 'third')[]; };Debería ser así:
export type MyType = { name: string; email: string; listings: MyOptions[]; }; Supongamos que tiene una variable llamada x de MyType , luego, para enviar un nuevo valor al miembro de listings , puede hacer x.listings.push(MyOptions.first)