typescript - Varför beter sig inte booleaner som booleaner?
Med TypeScript 3.9.5 har jag stött på TS-fel:
TS2365: Operatorn '!== ' kan inte tillämpas på typerna 'false' och 'true'
Förenklat exempel (koden gör ingenting, men representerar flödet i den faktiska funktionen):
function _huh() {
let allStatementsMatched = true
let invoiceIIDsToApply = []
if (_.isEmpty(invoiceIIDsToApply) === false) {
invoiceIIDsToApply.forEach(x => {
if (x.name === 'test') {
allStatementsMatched = false
}
})
// Why does the below statement result in error: TS2365?
if (allStatementsMatched === false) {
}
}
}
Jag har hittat flera GitHub-ärenden som diskuterar detta, men de handlar alla om mer komplexa scenarier och jag kan inte se hur de gäller mitt väldigt enkla exempel.
Varför behandlar inte TypeScript en boolean som en boolean? Varifrån kommer 'true' och 'false'?
Svar #1
Det har hänt mig tidigare, men bara när jag (av misstag) gör något sådant här:
let x: true;
let y: false;
if (x === false) {
//...whatever...
}
Som du kan se i kodavsnittet deklarerar jag x och y som variabler av typerna true och false istället för att tilldela värdena som nedan:
let x = true;
let y = false;
if (x === false) {
//...whatever...
}
Se till att du inte gör samma misstag. Ibland är den typen av dumma fel svåra att upptäcka.
Svar #2
Jag lade in din kod i sandlådan och jag fick
Detta villkor kommer alltid att returnera 'false' eftersom typerna 'true' och 'false' inte överlappar
Ingen stor grej, TypeScript igen med sin suveräna flödeskontrollanalys försöker vara smartare än mig.
let allStatementsMatched: boolean = true;
Tydligen hjälpte det inte. Konstigt eftersom det skulle göra det tyst vad gäller denna variabel inom dess räckvidd.
let allStatementsMatched = true as boolean;
Det ser ut som att true/false inte respekterar explicit typdeklaration och du måste göra en typomvandling för att få det att fungera.
