Typescript: Dizi girişine göre anahtarlarla arayüz döndür
Yapmaya çalıştığım şey şudur:
Bir dizi string'e dayanarak, dönüş türünü string'ler tarafından anahtarlanan bir kayıt olarak belirtmek istiyorum.
ör.
// return type -> { itemA:SomeType,itemB:SomeType }
const res = doThing(['itemA', 'itemB'])
Bu mümkün mü?
Cevap #1
Evet, doThing() metodunu gönderdiğiniz dizinin string giriş türlerinde genel hale getirmeniz gerekiyor. Şöyle görünebilir:
function doThing<K extends string>(arr: readonly K[]): { [P in K]: string } {
return Object.fromEntries(arr.map(v => [v, "hello"])) as any;
}
Şunu unutmayın ki K extends string ifadesi K'yi string'in bir alt türü ile sınırlıyor ve bu, derleyiciye K için (pek kullanışlı olmayan) string yerine string literal tiplerini türetmesini istediğinize dair bir ipucu veriyor. arr tipinin readonly K[] olduğunu unutmayın; bu, ReadonlyArray<K> tipinin kısa yazımıdır ve ismine rağmen, yazılabilir olanlar da dahil olmak üzere herhangi bir dizi tipine karşılık gelir (oysa Array<T> tipi yalnızca yazılabilir olduğu bilinen dizi tiplerine karşılık gelir. Evet, belki onları farklı adlarla adlandırmak daha iyi olurdu, mesela Readonly<T> yerine PossiblyNotWritableArray<T>? 🤷♂️). Bu yüzden readonly K[], aslında K[]'den daha izin vericidir.
Dönüş türü, {[P in K]: string} bir eşlenmiş türdür ve K içindeki anahtarlar P üzerinde yineleme yaparak her biri için string değerine sahip bir özellik üretir. Bu, Record<K, V> yardımcı türünü kullanarak Record<K, string> ile eşdeğerdir.
İstediğiniz şeyi yaptığından emin olalım:
const res = doThing(['itemA', 'itemB']);
/*const res: {
itemA: string;
itemB: string;
}*/
console.log(res);
/* {
"itemA": "hello",
"itemB": "hello"
} */
Güzel görünüyor!
Koda yönelik oyun alanı bağlantısı
