typescript - Cómo permitir solo literales de cadena únicos en un array
export interface IGUser {
biography: string;
id: string;
ig_id: string;
followers_count: number;
follows_count: number;
media_count: number;
name: string;
profile_picture_url: string;
shopping_product_tag_eligibility: boolean;
username: string;
website: string;
}
const values: keyof IGUser = ['biography', ''];
¿Cómo puedo implementar que solo pueda permitir una instancia de biografía en el arreglo?
Respuesta #1
No puedes hacer eso solo con escribir, pero podrías pasarlo por una función que elimine los duplicados: Eliminar elementos duplicados de un array
Respuesta #2
Bueno, es posible pero solo hasta cierta cantidad de claves. En algún punto, el cálculo de ese tipo de literal de arreglo único se volverá demasiado costoso porque depende de la longitud de tu Tipo Unión (keyof IGUser). Obtendrás un error "La instanciación de tipo es excesivamente profunda y posiblemente infinita".
De todos modos, inspirado por esta respuesta de Mu Tsun Tsai en la pregunta Tipo de tupla no ordenada, se me ocurrió lo siguiente. Utilizando un Tipo Mapeado y Exclude, puedes asegurarte de que todos los literales en tu arreglo sean únicos. Básicamente, calculas todas las combinaciones válidas basadas en la unión de las claves de tu objeto inicial. Ten en cuenta que este enfoque no permite literales duplicados, no solo "biografía".
interface IGUser {
biography: string;
name: string;
username: string;
// id: string;
// ig_id: string;
// followers_count: number;
// follows_count: number;
// media_count: number;
// profile_picture_url: string;
// shopping_product_tag_eligibility: boolean;
// website: string;
}
type SingleBiographyKeyArray<T extends string, R extends any[] = []> = R | {
[K in T]: SingleBiographyKeyArray<Exclude<T, K>, [K, ...R]>
}[T];
let values: SingleBiographyKeyArray<keyof IGUser> = []; // valid
values = ["biography"] // valid
values = ["biography", "name", "username"] // valid
values = ["biography", "biography", "name"];
// ~~~ invalid
values = ["biography", "username", "name", "name"];
// ~~~ invalid
Área de juego de TypeScript
