Skip to content

Commit 9641211

Browse files
committed
fix: object literal completions for optional boolean types
1 parent 3270cac commit 9641211

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

typescript/src/completions/objectLiteralCompletions.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,30 @@ const isStringCompletion = (type: ts.Type) => {
103103
return false
104104
}
105105

106-
const isBooleanCompletion = (type: ts.Type) => {
106+
const isBooleanCompletion = (type: ts.Type, checker: ts.TypeChecker) => {
107107
if (type.flags & ts.TypeFlags.Undefined) return false
108108
// todo support boolean literals (boolean like)
109109
if (type.flags & ts.TypeFlags.Boolean) return true
110-
if (type.isUnion()) return isEverySubtype(type, type => isBooleanCompletion(type))
110+
const trueType = (checker as unknown as FullChecker).getTrueType()
111+
const falseType = (checker as unknown as FullChecker).getFalseType()
112+
let seenTrueType = false
113+
let seenFalseType = false
114+
if (type.isUnion()) {
115+
const match = isEverySubtype(type, type => {
116+
if (!!(type.flags & ts.TypeFlags.Boolean)) return true
117+
if (type === trueType) {
118+
seenTrueType = true
119+
return true
120+
}
121+
if (type === falseType) {
122+
seenFalseType = true
123+
return true
124+
}
125+
return false
126+
})
127+
if (seenFalseType !== seenTrueType) return false
128+
return match
129+
}
111130
return false
112131
}
113132

0 commit comments

Comments
 (0)