typescript - Bir arayüzü uygulayan bir nesneyi kademeli olarak oluşturabilir miyim?
Benim şöyle bir arayüzüm var:
export interface Person {
name: string;
isMillenial: boolean;
}
Ve o arayüzü şu şekilde çıktılar veren bir fonksiyon:
function makePerson(name: string, birthYear: number): Person {
let newPerson = {
name
}
// Calculate various properties, slowly building up the `newPerson` object
newPerson.isMillenial = birthYear < 1981
return newPerson
}
Ancak bu, şu şekilde bir hata ile başarısız olacaktır:
Tür '{ name: string }' içinde 'isMillenial' özelliği eksik, ancak 'Person' türünde gerekli.
Yeni newPerson nesnesini oluşturduğumda, beklendiği gibi tüm özellikleri beyan edebileceğimi biliyorum - ama oluşturduğum nesneyi kademeli olarak inşa etmek, nesne tamamlanana kadar özellikler eklemek istiyorum. TypeScript'te nesneyi kademeli olarak inşa ederken tür kontrolünü hâlâ sağlamak için bir yol var mı?
(Cevap 'hayır, varsayılanlara ihtiyacınız var' ise, bu kabul edilebilir bir cevaptır)
Cevap #1
Evet, ama bunu farklı şekilde beyan etmeniz gerekecek ve nesneyi tamamladığınızda TypeScript'e söylemeniz gerekebilir. Partial yardımcı tipi, tüm özelliklerini isteğe bağlı hale getiren başka bir tipe dayalı bir tip oluşturur. Yani:
function makePerson(name: string, birthYear: number): Person {
let newPerson: Partial<Person> = {
// −−−−−−−−−−−−^^^^^^^^^^^^^^^
name
};
// Calculate various properties, slowly building up the `newPerson` object
newPerson.isMillenial = birthYear < 1981;
return newPerson as Person;
// −−−−−−−−−−−−−−^^^^^^^^^
}
Maalesef, sonda yapılan tür dönüşümü gerekli (bu beni şaşırttı, yukarıdan görebileceğiniz gibi hiçbir özellik sonrasında undefined olmayacak, ancak TypeScript ekibi, derleyicinin çok yavaşlamasını önlemek için ne kadar akıllı olabileceğine bir sınır koymak zorunda).
Oyun alanı linki
Dönüşteki as Person ayrıca, isterseniz fonksiyon deklarasyon imzasından bunu çıkarabileceğiniz anlamına gelir, TypeScript fonksiyonun dönüş tipini bilir:
function makePerson(name: string, birthYear: number): Person {
// Optional as far as TypeScript is concerned −−−−−−^^^^^^^^
...ancak fonksiyon birkaç satırdan fazlaysa, başka bir yerde dönüş tipini değiştirecek yeni bir return eklememenizi sağlamak için onu orada bırakmak isteyebilirsiniz.
Bunu soruda bahsettiniz, ama değdiği kadar (ve izleyenler için) vurgulayayım ki, nesneyi oluşturmak için kullanacağınız bilgileri toplayabilir, ardından tür açıklamasına gerek duymadan nesneyi bir kerede oluşturabilirsiniz. Bu örneği oldukça basitleştirir, ancak elbette gerçek kod her zaman daha basit olmayabilir:
function makePerson(name: string, birthYear: number): Person {
const isMillenial = birthYear < 1981;
return {name, isMillenial};
}
Bu her zaman mümkün değil, ama mümkün olduğunda faydalı buluyorum.
