TypeScript dizin imzası, isteğe bağlı özellikleri dizine ekler
Typescript 3.5.3'te böyle bir şey ilan etmek istiyorum
interface User {firstName: string}
interface Contacts {[index: string]: User | undefined}
Temelde, TypeScript'in erişmeye çalıştığım özelliğin potansiyel olarak tanımsız olabileceği konusunda beni uyarmasını istiyorum. Şu anda, bunu yazdığımda durum böyle değil:
const contacts: Contact = {};
const randomId = '1240astat0252';
const user = contacts[randomId]; //typescript doesn't warn me about this being undefined
düzenleme: üzerinde çalıştığım belirli projede tsconfig'te strict: true ayarlamayı unuttum, bu da user.firstName için bir hata oluşturmayacaktı. Soru orijinal halindeyken, cevap doğru.
Cevap #1
Genel olarak, TypeScript sadece potansiyel olarak geçersiz olan veya büyük olasılıkla bir hata olabilecek bir şey yaptığınızda sizi uyarır.
Bu durumda, değilsiniz. Tanımsız olabilecek bir alanı okuyorsunuz, ancak bu hemen bir hata oluşturmaz ve bu, sözlük tarzı bir nesnedir, bu da bunun normal bir davranış olduğunu gösterir.
Eğer kesinlikle tehlikeli olan bir şey yaparsanız, örneğin o user değişkenini kullanır ve tanımlı olduğunu varsayarsanız, bir hata alırsınız. Örneğin:
interface User {firstName: string}
interface Contact {[index: string]: User | undefined}
const contacts: Contact = {};
const randomId = '1240astat0252';
const user = contacts[randomId];
console.log(user.firstName); // Error: Object is possibly 'undefined'
Çoğu durum için, bu yeterlidir. Bu, gerçekten alınan özellikleri kullanan herhangi bir kodun önce onların değerinin tanımlı olduğunu doğrulamasını sağlar (örneğin if (user) { ... }).
Herhangi bir bilinmeyen özellik erişiminde hata almak istiyorsanız, indeks imzasını kaldırmanız gerekir. İndeks imzası olmayan alanlara gerçekten erişebilmek için, alanın kesinlikle var olduğunu TypeScript'e göstermeniz gerekir. Birkaç seçenek vardır, ancak bir örnek olarak özel bir tür koruyucu (type guard) kullanabilirsiniz:
interface User {firstName: string}
type HasContact<N extends string> = { [name in N]: User };
function hasContact<N extends string>(x: {}, name: N): x is HasContact<N> {
return name in x;
}
const contacts = {};
const randomId = '1240astat0252';
const user = contacts[randomId]; // Error
if (hasContact(contacts, randomId)) {
const user = contacts[randomId]; // Inside the 'if' this is all good
contacts['differentId']; // Still an error
}
