Skip to content

Commit 60587e4

Browse files
committed
Eliminate a couple type assertions
1 parent 3b06338 commit 60587e4

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

src/language/semantics/type-system/type-formats.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,15 @@ export type UnionType = {
152152
>
153153
}
154154

155-
export const makeUnionType = (
155+
type SpecificUnionType<Member extends Atom | Exclude<Type, UnionType>> =
156+
UnionType & {
157+
readonly members: ReadonlySet<Member>
158+
}
159+
160+
export const makeUnionType = <Member extends Atom | Exclude<Type, UnionType>>(
156161
name: string,
157-
members: readonly (Atom | Exclude<Type, UnionType>)[],
158-
): UnionType => ({
162+
members: readonly Member[],
163+
): SpecificUnionType<Member> => ({
159164
name,
160165
kind: 'union',
161166
members: new Set(members),

src/language/semantics/type-system/type-utilities.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,7 @@ const containedTypeParametersImplementation = (
8080
stringifyKeyPath(root),
8181
{
8282
keyPath: root,
83-
typeParameters:
84-
// TODO: eliminate the type assertion, perhaps by making `makeUnionType` generic
85-
// over the member type
86-
makeUnionType('', [type]) as UnionOfTypeParameters,
83+
typeParameters: makeUnionType('', [type]),
8784
},
8885
],
8986
]),
@@ -382,18 +379,33 @@ const mergeTypeParametersByKeyPath = (
382379
if (valueFromB === undefined) {
383380
result.set(key, { keyPath, typeParameters })
384381
} else {
385-
// Merge all type(s) at this key path into a union.
382+
// Merge all type(s) at this key path into a (simplified) union.
383+
const supposedTypeParametersAsArray = [
384+
...simplifyUnionType(
385+
makeUnionType(typeParameters.name, [
386+
...typeParameters.members,
387+
...valueFromB.typeParameters.members,
388+
]),
389+
).members.values(),
390+
]
391+
if (
392+
!supposedTypeParametersAsArray.every(
393+
supposedTypeParameter =>
394+
typeof supposedTypeParameter !== 'string' &&
395+
supposedTypeParameter.kind == 'parameter',
396+
)
397+
) {
398+
throw new Error(
399+
'Union type member was unexpectedly not a type parameter. This is a bug!',
400+
)
401+
}
402+
386403
result.set(key, {
387404
keyPath,
388-
typeParameters:
389-
// TODO: eliminate the type assertion, perhaps by making `makeUnionType` and
390-
// `simplifyUnionType` generic over their member types
391-
simplifyUnionType(
392-
makeUnionType(typeParameters.name, [
393-
...typeParameters.members,
394-
...valueFromB.typeParameters.members,
395-
]),
396-
) as UnionOfTypeParameters,
405+
typeParameters: makeUnionType(
406+
typeParameters.name,
407+
supposedTypeParametersAsArray,
408+
),
397409
})
398410
}
399411
}

0 commit comments

Comments
 (0)