Size bu hatayı verecek birkaç durum vardır. OP durumunda, açıkça bir dize olarak tanımlanan bir değer vardı . Bu yüzden belki bu bir açılan, web hizmeti veya ham JSON dizesinden geldiğini varsaymak zorunda.
Bu durumda basit bir oyuncu <Fruit> fruitStringveya fruitString as Fruittek çözüm budur (diğer cevaplara bakınız). Derleme zamanında bunu hiç geliştiremezsiniz. [ Düzenle: Hakkında diğer cevabımı gör<const> ]!
Ancak, kodunuzda tür dizesi olması amaçlanmamış sabitleri kullanırken aynı hatayla karşılaşmak çok kolaydır . Cevabım şu ikinci senaryoya odaklanıyor:
Her şeyden önce: 'Sihirli' dize sabitleri neden bir numaradan daha iyidir?
- Bir dize sabitinin bir numaralamaya karşı görünümünü seviyorum - kompakt ve 'javascripty'
- Kullandığınız bileşen zaten dize sabitleri kullanıyorsa daha anlamlı olur.
- Sadece bir numaralandırma değeri elde etmek için bir 'numara türü' almak zorunda kalmak kendi başına zahmetli olabilir
- Ne olursa olsun , sendika türünden geçerli bir değeri kaldırırsanız veya yanlış yazarsam, derleme hatası vermesi GEREKİR bu yüzden güvenli derlemek istiyorum .
Neyse ki tanımladığınızda:
export type FieldErrorType = 'none' | 'missing' | 'invalid'
... aslında bir tanımlarken türleri birliği'missing' aslında bir türüdür!
'banana'Benim daktilo gibi bir dize varsa ve derleyici bir dize olarak kastettiğini düşünürken sık sık 'atanabilir değil' hata içine çalıştırın , oysa ben gerçekten tür olmasını istedim banana. Derleyicinin ne kadar akıllı olabileceği, kodunuzun yapısına bağlıdır.
İşte bugün bu hatayı aldığımda bir örnek:
// this gives me the error 'string is not assignable to type FieldErrorType'
fieldErrors: [ { fieldName: 'number', error: 'invalid' } ]
En kısa sürede ben öğrendim olarak 'invalid'veya 'banana'bir tür ya da ben tekini fark bir dize ya olabileceğini bu tür bir dize assert . Temelde kendi kendine döküm ve derleyiciye hayır bunu bir dize olmasını istemiyorum söyle !
// so this gives no error, and I don't need to import the union type too
fieldErrors: [ { fieldName: 'number', error: <'invalid'> 'invalid' } ]
Peki, sadece FieldErrorType(veya Fruit) '
// why not do this?
fieldErrors: [ { fieldName: 'number', error: <FieldErrorType> 'invalid' } ]
Zaman güvenli derlemek değil:
<FieldErrorType> 'invalidddd'; // COMPILER ALLOWS THIS - NOT GOOD!
<FieldErrorType> 'dog'; // COMPILER ALLOWS THIS - NOT GOOD!
'dog' as FieldErrorType; // COMPILER ALLOWS THIS - NOT GOOD!
Neden? Bu daktilo yani <FieldErrorType>bir iddia ve derleyiciye bir köpek bir FieldErrorType olduğunu söylüyorsun ! Ve derleyici buna izin verecek!
AMA aşağıdakileri yaparsanız, derleyici dizeyi bir türe dönüştürür
<'invalid'> 'invalid'; // THIS IS OK - GOOD
<'banana'> 'banana'; // THIS IS OK - GOOD
<'invalid'> 'invalidddd'; // ERROR - GOOD
<'dog'> 'dog'; // ERROR - GOOD
Bunun gibi aptal yazım hatalarına dikkat edin:
<'banana'> 'banan'; // PROBABLY WILL BECOME RUNTIME ERROR - YOUR OWN FAULT!
Sorunu çözmenin başka bir yolu da ana nesneyi dökmektir:
Tanımlarım şöyleydi:
dışa aktarma türü FieldName = 'sayı' | 'expirationDate' | 'CVV'; dışa aktarma türü FieldError = 'none' | 'eksik' | 'geçersiz'; dışa aktarma türü FieldErrorType = {field: FieldName, hata: FieldError};
Diyelim ki bu konuda bir hata alıyoruz (dize atanamaz hatası):
fieldErrors: [ { field: 'number', error: 'invalid' } ]
Bütün nesneyi şöyle söyleyebiliriz FieldErrorType:
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'invalid' } ]
Sonra yapmaktan kaçınırız <'invalid'> 'invalid'.
Peki ya yazım hataları? <FieldErrorType>Sadece bu tip olma hakkının ne olduğunu iddia etmekle kalmaz . Değil bu durumda - neyse derleyici OLACAK Bunu eğer imkansız olduğunu biliyorum kadar zeki olduğu için, şikayet:
fieldErrors: [ <FieldErrorType> { field: 'number', error: 'dog' } ]
export type Fruit?