typescript - Belirli bir şekle sahip özelliklerin anahtarları için birleşim türü oluştur
Elimde şu nesne yapısı var SomeParamList, burada anahtar bir string ve değerler tanımsız olabilecek veya rastgele anahtar değer çiftlerine sahip bir nesne olabilir. Sadece değerin en az { password: string } içerdiği nesne anahtarlarını dahil eden bir birleşim türü belirtmek istiyorum.
type SomeParamList = {
FirstScreen: undefined,
SecondScreen: {someParam: string}
ThirdScreen: {password: string, name: string},
FourthScreen: {password:string}
}
type KeysWithPass = ...
// ^? "ThirdScreen" | "FourthScreen"
DÜZENLE :
Şu ana kadar denediğim şey şudur:
type Narrowed<T, U> = {
[K in keyof T]: T[K] extends U ? T[K] : never;
};
Bu, türün genişlememesi durumunda tüm özelliklerin never olduğu bir nesne döndürür. Ama buna keyof yapmaya çalıştığımda, sadece orijinal türü döndürür.
Cevap #1
Haritalanmış bir tipin içindeki doğru özellikleri filtrelemek için anahtar yeniden eşlemeyi kullanabilirsiniz. Ortaya çıkan tip üzerinde keyof kullanmak, aradığınız string literal tiplerini döndürecektir.
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"
Oyun alanı
Cevap #2
Yani soruyu yanlış anlamışım. İşte talep edildiği gibi birleşim:
type IfHasPassword<T> = T extends T & { password: string } ? T : never;
type KeysWithPass = IfHasPassword<SomeParamList[keyof SomeParamList]>
Parola için yapılan kontrollerin ana kısmı bu kod parçasıdır: T extends T & { password: string }
Bildiğim kadarıyla, yardımcı tür gereklidir.
Orijinal cevap:
Bence bu, istediğin şey:
type KeysWithPass<T extends { password: string }> = T;
function withPassword<T extends { password: string }>(param: T) {
return param.password
}
Eğer onun SomeParamList listesinin bir parçası olmasını istiyorsanız, türü şu şekilde daha fazla kısıtlamanız gerekir:
type KeysWithPass<T extends { password: string } & SomeParamList[keyof SomeParamList]> = T;
