typescript - Crear tipo unión para las claves de propiedades con forma específica
Tengo esta estructura de objeto SomeParamList, donde la clave es una cadena y los valores pueden ser indefinidos o un objeto con pares clave-valor arbitrarios. Quiero especificar un tipo de unión de las claves del objeto que solo incluya aquellas donde el valor tenga al menos { password: string }.
type SomeParamList = {
FirstScreen: undefined,
SecondScreen: {someParam: string}
ThirdScreen: {password: string, name: string},
FourthScreen: {password:string}
}
type KeysWithPass = ...
// ^? "ThirdScreen" | "FourthScreen"
EDITAR :
Lo que he intentado hasta ahora es esto:
type Narrowed<T, U> = {
[K in keyof T]: T[K] extends U ? T[K] : never;
};
Devuelve un objeto donde todas las propiedades son never cuando el tipo no se extiende. Pero cuando intento hacer keyof de esto, solo devuelve el tipo original.
Respuesta #1
Deberías poder usar la reasignación de claves para filtrar las propiedades correctas dentro de un tipo mapeado. Usar keyof en el tipo resultante devolverá los tipos de literales de cadena que estás buscando.
type Narrowed<T, U> = keyof {
[K in keyof T as T[K] extends U ? K : never]: any;
};
type KeysWithPass = Narrowed<SomeParamList, { password: string }>
// type KeysWithPass = "ThirdScreen" | "FourthScreen"
Patio de recreo
Respuesta #2
Así que había malinterpretado la pregunta. Aquí está la unión, como se solicitó:
type IfHasPassword<T> = T extends T & { password: string } ? T : never;
type KeysWithPass = IfHasPassword<SomeParamList[keyof SomeParamList]>
Lo que verifica la contraseña es principalmente este fragmento: T extends T & { password: string }
Hasta donde yo sé, el tipo de ayudante es necesario.
Respuesta original:
Creo que esto es lo que quieres:
type KeysWithPass<T extends { password: string }> = T;
function withPassword<T extends { password: string }>(param: T) {
return param.password
}
Si quieres que sea parte de la SomeParamList, tienes que restringir más el tipo, así:
type KeysWithPass<T extends { password: string } & SomeParamList[keyof SomeParamList]> = T;
