Typescript türlerine göre nesne oluşturma

0

Soru

Yoksa bu tip var ki

type foo = {
 go: string;
 start: string;
}

Dinamik olarak geri dönecek bir işlevi nasıl yapabilirim

{ go: '', start: '' }

Type Komut Dosyasında, yalnızca yalnızca türüne göre dinamik olarak boş nesne oluşturabileceğimiz herhangi bir yol var mı? Ya da bu imkansız çünkü sadece döngü yapamayız

Şöyle bir şey düşünüyordum

function generate<T>(T)<T>  {
 const obj = {}
 for (const key of keyof T) {
   obj[key] = ''
 }
 return obj
}
typescript
2021-11-23 19:36:25
2

En iyi cevabı

2

TypeScript derleyicisini çalıştırdığınızda (tsc) TypeScript kodunu çalıştırılabilir Javascript'e aktarmak için dilin statik tip sistemi silinir. Yani senin Foo tür (TH adlandırma kurallarına uyması için büyük harfle yeniden adlandırıldı) çalışma zamanında hiçbir biçimde yok. Anahtarları almak için yineleyebileceğiniz hiçbir şey yok go ve start.


Çalışma zamanında bir şey olmasını sağlamanın en kolay yolu, bunu yapmak için gereken JavaScript'i yazmak ve ardından TypeScript derleyicisinin siz yazarken ihtiyacınız olan güçlü türleri verebildiğinden emin olmaktır. Bu temelde yapmaya çalıştığın şeyin tam tersi.

Senin durumunda: ne yapar generate() çalışma zamanında çalışmak için ihtiyacınız var mı? Peki, eğer değerlerin generate() sadece tutan nesneler olacak string- değerli özellikler, o zaman nesnenin anahtarlarının bir listesini iletmemiz gerekir. Peki ya yazarsak generate() bunu yapmak ve sonra tanımlamak için Foo çıktı açısından generate() tam tersi yerine mi?

Örneğin:

function generate<K extends PropertyKey>(...keys: K[]) {
  return Object.fromEntries(keys.map(k => [k, ""])) as { [P in K]: string };
}

const myFooObject = generate("go", "start");

type Foo = typeof myFooObject;
/* type Foo = {
    go: string;
    start: string;
} */

console.log(myFooObject)
/* {
  "go": "",
  "start": ""
} */

Burada generate() anahtarların bir listesini (tür) alan genel bir işlevdir K) ve anahtarlarla bir tür değer üretir. K ve tür değerleri string. O {[P in K]: string} eşlenen bir tür eşdeğerdir Record<K, string> kullanarak Record<K, V> yardımcı program türü.

Uygulama kullanırObject.fromEntries() nesneyi oluşturmak için ve TypeScript gördüğü için dönüş türünün doğru tür olduğu iddia edilir Object.fromEntries() bizim amaçlarımız için çok geniş bir türü iade etmek gibi.

Her neyse aradığında const myFooObject = generate("go", "start"), bu tür bir değer üretir {go: string; start: string}, ki bu senin ile aynı Foo tip. Yani sadece tanımlayabiliriz Foo olarak type Foo = typeof myFooObject bunun yerine el ile yapıyor. Sen - ebil hala o el, ama konu ben olduğumu gösteren o kadar çok daha kolay yazma , KURU kodu olarak TypeScript eğer başlangıç değerleri ve üretmek türlerinden yerine çalışırken yap, diğer taraftan.


Yine, TypeScript derleyicisini kullanıyorsanız tsc olduğu gibi, silme yazın yazmanızı engeller generate() tanımından Foo. Ama...

Projenize bir oluşturma adımı eklemek ve TypeScript derleyici API'sini veya bunun gibi bir şeyi kullanarak kod oluşturma işlemini gerçekleştirmek istiyorsanız, türlerle rasgele şeyler yapabilirsiniz. İstediğinize benzer şeyler yapan kitaplıklar vardır; örneğin, ts-auto-mock, tam olarak kullanım durumunuza benzeyen bir nesne türü verildiğinde sahte nesneler ürettiğini iddia eder.

Böyle ekstra bir yapı adımı sizin için makul bir yaklaşım olabilir, ancak bu rotaya giderseniz, artık sadece düz TypeScript kullanmadığınızı (ve bu nedenle konunun muhtemelen kapsamı dışında olduğunu) not etmelisiniz. sadece bir TypeScript etiketi olan bir soru).

Oyun alanı koduna bağlantı

2021-11-25 04:07:53
1

Bunu genel hale getirebilirsin, bunun gibi:

type foo<T extends string = string> = {
    go: T;
    start: T;
}

const test: foo<''> = {
    go: '',
    start: '',
};

TypeScript Oyun Alanı

2021-11-23 19:47:19

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................