Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
7410ac9
Initial implementation of variadic tuple types
ahejlsberg Jun 1, 2020
e5d6be7
Accept new baselines
ahejlsberg Jun 1, 2020
6d6bf6d
Handle variadic elements in tuple type inference
ahejlsberg Jun 4, 2020
5679f36
Special case inference between tuples with matching structure
ahejlsberg Jun 4, 2020
94dd625
Restore check that rest element is last element
ahejlsberg Jun 4, 2020
8669342
Handle variadic tuples in relationship checking
ahejlsberg Jun 7, 2020
34fd780
Accept new baselines
ahejlsberg Jun 7, 2020
e8466d7
Infer readonly constraints when inferring from readonly tuples
ahejlsberg Jun 8, 2020
20eb59e
Fix lint issues
ahejlsberg Jun 8, 2020
54d7d40
T assignable to readonly [...T] and [...T] assignable to T
ahejlsberg Jun 8, 2020
d2b3128
Consistent tuple normalization
ahejlsberg Jun 8, 2020
5902c21
Create variadic tuple types from array literal expressions
ahejlsberg Jun 8, 2020
5d78ed1
Accept new baselines
ahejlsberg Jun 8, 2020
b6b9d4a
Array literals have tuple types when contextual type is readonly
ahejlsberg Jun 9, 2020
0a7c6a9
Accept new baselines
ahejlsberg Jun 9, 2020
97184ab
Optional elements before required elements become required elements
ahejlsberg Jun 9, 2020
7449a6b
Update logic for rest parameters and spread arguments
ahejlsberg Jun 12, 2020
7f0917b
Revert special case of contextual readonly array type
ahejlsberg Jun 12, 2020
0388e8e
Accept new baselines
ahejlsberg Jun 12, 2020
635d440
Fix lint issue
ahejlsberg Jun 13, 2020
32bbd4c
Switch entirely to createTupleType based on element flags
ahejlsberg Jun 13, 2020
10a9eb9
Don't infer readonly tuple types when inferring to variadic elements
ahejlsberg Jun 14, 2020
bb989fc
Handle mapped types applied to generic tuple types
ahejlsberg Jun 14, 2020
fec03a1
Handle constraint of indexed access type with generic tuple type
ahejlsberg Jun 16, 2020
9a04edc
Merge branch 'master' into variadicTuples
ahejlsberg Jun 16, 2020
01d3b54
Accept new baselines
ahejlsberg Jun 16, 2020
2791938
Address CR feedback
ahejlsberg Jun 17, 2020
d37c514
Merge branch 'master' into variadicTuples
ahejlsberg Jun 17, 2020
7593522
Simplify indexed access types involving generic tuple types
ahejlsberg Jun 17, 2020
eb50893
Propagate checkMode into getSpreadArgumentType
ahejlsberg Jun 17, 2020
8f41104
Guard against missing globalArrayType
ahejlsberg Jun 18, 2020
eedf7f1
Inference to [...T, ...U] based on implied arity of T
ahejlsberg Jun 19, 2020
bc04a8d
Merge branch 'master' into variadicTuples
ahejlsberg Jun 19, 2020
aa2c49d
Accept new baselines
ahejlsberg Jun 19, 2020
7bc595b
Add tests
ahejlsberg Jun 20, 2020
0fc28f2
Emit .d.ts from tests
ahejlsberg Jun 22, 2020
11f70be
Address CR feedback
ahejlsberg Jun 23, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Consistent tuple normalization
  • Loading branch information
ahejlsberg committed Jun 8, 2020
commit d2b31289759d0bffb7b5fdd75363a7eb5f5d9860
14 changes: 8 additions & 6 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12276,15 +12276,15 @@ namespace ts {
}

function createTupleTypeEx(elementTypes: readonly Type[], elementFlags: readonly ElementFlags[], readonly = false, namedMemberDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]) {
if (elementFlags.length === 1 && elementFlags[0] & ElementFlags.Rest) {
// [...X[]] is equivalent to just X[]
return createArrayType(elementTypes[0], readonly);
}
const tupleTarget = getTupleTargetType(elementFlags, readonly, namedMemberDeclarations);
return elementFlags.length ? createTypeReference(tupleTarget, elementTypes) : tupleTarget;
return elementFlags.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : tupleTarget;
}

function getTupleTargetType(elementFlags: readonly ElementFlags[], readonly: boolean, namedMemberDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]): GenericType {
if (elementFlags.length === 1 && elementFlags[0] & ElementFlags.Rest) {
// [...X[]] is equivalent to just X[]
return readonly ? globalReadonlyArrayType : globalArrayType;
}
const key = map(elementFlags, f => f & ElementFlags.Required ? "#" : f & ElementFlags.Optional ? "?" : f & ElementFlags.Rest ? "." : "*").join() +
(readonly ? "R" : "") +
(namedMemberDeclarations && namedMemberDeclarations.length ? "," + map(namedMemberDeclarations, getNodeId).join(",") : "");
Expand Down Expand Up @@ -12408,7 +12408,8 @@ namespace ts {
// Create a union of the collected rest element types.
expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes);
}
return createTupleTypeEx(expandedTypes, expandedFlags, target.readonly, expandedDeclarations);
const tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations);
return expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : tupleTarget;

function addElementOrRest(type: Type, flags: ElementFlags, declaration: NamedTupleMember | ParameterDeclaration | undefined) {
if (restTypes) {
Expand Down Expand Up @@ -16563,6 +16564,7 @@ namespace ts {
}
}

// For a generic type T, [...T] is assignable to T and T is assignable to readonly [...T].
if (isSingleElementGenericTupleType(source) && !source.target.readonly && getTypeArguments(source)[0] === target ||
isSingleElementGenericTupleType(target) && target.target.readonly && getTypeArguments(target)[0] === source) {
return Ternary.True;
Expand Down