Búsqueda de sitios web

Typescript: Excluir la clave de la propiedad cuando empieza con la cadena objetivo


Quiero crear un nuevo tipo de objeto a partir del tipo Original que sea filtrado cuando la clave de la propiedad comience con la Cadena Objetivo.

Tipo de origen:

type Origin = {
    a: string,
    b: string,
    _c: string,
    _d: string,
}

Tipo de resultado como quiero.

// type Result = SomethingWork<Origin, '_'>;
type Result = {
    a: string,
    b: string
};

El tipo de origen tiene claves de propiedad dinámicas, por lo que no es correcto usar el tipo directamente como '_c' | '_d'

Respuesta #1

Esto ahora es posible con los tipos de literales de plantilla

type FilterNotStartingWith<Set, Needle extends string> = Set extends `${Needle}${infer _X}` ? never : Set

Ejemplo :

type Origin = {
  a: string,
  b: string,
  _c: string,
  _d: string,
}

type FilteredKeys = FilterNotStartingWith<keyof Origin, '_'>
type NewOrigin = Pick<Origin, FilteredKeys>
/*
type NewOrigin = {
  a: string;
  b: string;
}
*/

Respuesta #2

Me gustaría ofrecer una ligera simplificación de la respuesta existente.

type Origin = {
  a: string,
  b: string,
  _c: string,
  _d: string,
}

type OriginWithoutUnderscoreProps = Omit<Origin, `_${string}`>
/*
type OriginWithoutUnderscoreProps = {
  a: string;
  b: string;
}
*/

El inverso para la inclusión también funciona. Nota, se necesita keyof Origin aquí porque Pick tiene una restricción de keyof en su segundo argumento, mientras que Omit no la tiene.

type OriginWithUnderscoreProps = Pick<Origin, keyof Origin & `_${string}`>
/*
type OriginWithUnderscoreProps = {
  _c: string;
  _d: string;
}
*/

Artículos relacionados