Saya bertanya-tanya apakah saya dapat memiliki tipe bersyarat dalam TypeScript?
Saat ini saya memiliki antarmuka sebagai berikut:
interface ValidationResult {
isValid: boolean;
errorText?: string;
}
Tapi saya ingin menghapus errorText
, dan hanya memilikinya ketika isValid
adalah false
sebagai diperlukan properti.
Saya berharap saya bisa menulisnya sebagai antarmuka berikut:
interface ValidationResult {
isValid: true;
}
interface ValidationResult {
isValid: false;
errorText: string;
}
Tapi seperti yang Anda tahu, itu tidak mungkin. Jadi, apa idemu tentang situasi ini?
javascript
typescript
types
Arman
sumber
sumber
isValid
inifalse
?Jawaban:
Salah satu cara untuk memodelkan jenis logika ini adalah dengan menggunakan tipe union, sesuatu seperti ini
Compiler kemudian dapat mempersempit jenis berdasarkan bendera boolean
sumber
r
harus mengetik diInvalid
sini.Untuk menghindari membuat banyak antarmuka yang hanya digunakan untuk membuat yang ketiga, Anda juga dapat berganti secara langsung, dengan yang
type
:sumber
The serikat ditunjukkan oleh bug adalah bagaimana saya sarankan penanganan ini. Meskipun demikian, Typefrip memang memiliki sesuatu yang dikenal sebagai " tipe bersyarat ," dan mereka dapat menangani ini.
Ini
ValidationResult
(yang sebenarnyaValidationResult<boolean>
disebabkan oleh parameter default) setara dengan gabungan yang dihasilkan dalam jawaban bug atau dalam jawaban SpecificPerformance , dan dapat digunakan dengan cara yang sama.Keuntungannya di sini adalah Anda juga bisa memberikan
ValidationResult<false>
nilai yang diketahui , dan kemudian Anda tidak perlu mengujiisValid
karena akan diketahuifalse
danerrorString
diketahui ada. Mungkin tidak perlu untuk kasus seperti ini — dan tipe kondisional mungkin rumit dan sulit untuk di-debug, jadi mereka mungkin tidak boleh digunakan secara tidak perlu. Tapi Anda bisa, dan itu sepertinya layak disebut.sumber
extends
merupakan operator yang tepat untuk digunakan. Dan memiliki sangat kuat, terutama karena Anda juga dapat menggunakannya untuk menggali ke dalam jenis:type SecondOf<T> = T extends Pair<any, infer U> ? U : never;
.SecondOf<number>
'mengembang'Pair<any, number>
? Saya kira ungkapan "jangan menilai buku dari sampulnya" relevan di sini.SecondOf<Pair<any, number>>
mengevaluasi kenumber
.SecondOf<number>
mengevaluasi kenever
, karenanumber extends Pair<any, infer U>
salah, karenanumber
tidak memperpanjangPair