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ı