@@ -2219,15 +2219,15 @@ namespace ts {
2219
2219
else if (type.flags & TypeFlags.StringOrNumberLiteral) {
2220
2220
writer.writeStringLiteral(literalTypeToString(<LiteralType>type));
2221
2221
}
2222
- else if (type.flags & TypeFlags.PropertyName ) {
2222
+ else if (type.flags & TypeFlags.Index ) {
2223
2223
writer.writeKeyword("keyof");
2224
2224
writeSpace(writer);
2225
- writeType((<PropertyNameType >type).type, TypeFormatFlags.InElementType);
2225
+ writeType((<IndexType >type).type, TypeFormatFlags.InElementType);
2226
2226
}
2227
- else if (type.flags & TypeFlags.PropertyAccess ) {
2228
- writeType((<PropertyAccessType >type).objectType, TypeFormatFlags.InElementType);
2227
+ else if (type.flags & TypeFlags.IndexedAccess ) {
2228
+ writeType((<IndexedAccessType >type).objectType, TypeFormatFlags.InElementType);
2229
2229
writePunctuation(writer, SyntaxKind.OpenBracketToken);
2230
- writeType((<PropertyAccessType >type).keyType , TypeFormatFlags.None);
2230
+ writeType((<IndexedAccessType >type).indexType , TypeFormatFlags.None);
2231
2231
writePunctuation(writer, SyntaxKind.CloseBracketToken);
2232
2232
}
2233
2233
else {
@@ -5678,73 +5678,73 @@ namespace ts {
5678
5678
return startsWith(prop.name, "__@") ? neverType : getLiteralTypeForText(TypeFlags.StringLiteral, unescapeIdentifier(prop.name));
5679
5679
}
5680
5680
5681
- function getPropertyNameTypeForTypeParameter (type: TypeParameter) {
5682
- if (!type.resolvedPropertyNameType ) {
5683
- type.resolvedPropertyNameType = <PropertyNameType >createType(TypeFlags.PropertyName );
5684
- type.resolvedPropertyNameType .type = type;
5681
+ function getIndexTypeForTypeParameter (type: TypeParameter) {
5682
+ if (!type.resolvedIndexType ) {
5683
+ type.resolvedIndexType = <IndexType >createType(TypeFlags.Index );
5684
+ type.resolvedIndexType .type = type;
5685
5685
}
5686
- return type.resolvedPropertyNameType ;
5686
+ return type.resolvedIndexType ;
5687
5687
}
5688
5688
5689
- function getPropertyNameType (type: Type): Type {
5689
+ function getIndexType (type: Type): Type {
5690
5690
return type.flags & TypeFlags.TypeParameter ?
5691
- getPropertyNameTypeForTypeParameter (<TypeParameter>type) :
5691
+ getIndexTypeForTypeParameter (<TypeParameter>type) :
5692
5692
getUnionType(map(getPropertiesOfType(type), getLiteralTypeFromPropertyName));
5693
5693
}
5694
5694
5695
5695
function getTypeFromTypeOperatorNode(node: TypeOperatorNode) {
5696
5696
const links = getNodeLinks(node);
5697
5697
if (!links.resolvedType) {
5698
- links.resolvedType = getPropertyNameType (getTypeFromTypeNodeNoAlias(node.type));
5698
+ links.resolvedType = getIndexType (getTypeFromTypeNodeNoAlias(node.type));
5699
5699
}
5700
5700
return links.resolvedType;
5701
5701
}
5702
5702
5703
- function createPropertyAccessType (objectType: Type, keyType: TypeParameter) {
5704
- const type = <PropertyAccessType >createType(TypeFlags.PropertyAccess );
5703
+ function createIndexedAccessType (objectType: Type, keyType: TypeParameter) {
5704
+ const type = <IndexedAccessType >createType(TypeFlags.IndexedAccess );
5705
5705
type.objectType = objectType;
5706
- type.keyType = keyType;
5706
+ type.indexType = keyType;
5707
5707
return type;
5708
5708
}
5709
5709
5710
- function getPropertyAccessTypeForTypeParameter (objectType: Type, keyType: TypeParameter) {
5711
- const propertyAccessTypes = keyType.resolvedPropertyAccessTypes || (keyType.resolvedPropertyAccessTypes = []);
5712
- return propertyAccessTypes [objectType.id] || (propertyAccessTypes [objectType.id] = createPropertyAccessType (objectType, keyType));
5710
+ function getIndexedAccessTypeForTypeParameter (objectType: Type, keyType: TypeParameter) {
5711
+ const indexedAccessTypes = keyType.resolvedIndexedAccessTypes || (keyType.resolvedIndexedAccessTypes = []);
5712
+ return indexedAccessTypes [objectType.id] || (indexedAccessTypes [objectType.id] = createIndexedAccessType (objectType, keyType));
5713
5713
}
5714
5714
5715
- function getPropertyAccessType (objectType: Type, keyType: Type) {
5715
+ function getIndexedAccessType (objectType: Type, keyType: Type) {
5716
5716
if (keyType.flags & TypeFlags.TypeParameter) {
5717
- return getPropertyAccessTypeForTypeParameter (objectType, <TypeParameter>keyType);
5717
+ return getIndexedAccessTypeForTypeParameter (objectType, <TypeParameter>keyType);
5718
5718
}
5719
5719
if (isTypeOfKind(keyType, TypeFlags.StringLiteral) && !(keyType.flags & TypeFlags.Intersection)) {
5720
5720
return mapType(keyType, t => getTypeOfPropertyOfType(objectType, escapeIdentifier((<LiteralType>t).text)) || unknownType);
5721
5721
}
5722
5722
return keyType.flags & TypeFlags.Any ? anyType : unknownType;
5723
5723
}
5724
5724
5725
- function resolvePropertyAccessTypeNode (node: PropertyAccessTypeNode ) {
5725
+ function resolveIndexedAccessTypeNode (node: IndexedAccessTypeNode ) {
5726
5726
const objectType = getTypeFromTypeNodeNoAlias(node.objectType);
5727
- const keyType = getTypeFromTypeNodeNoAlias(node.keyType );
5727
+ const keyType = getTypeFromTypeNodeNoAlias(node.indexType );
5728
5728
if (keyType.flags & TypeFlags.TypeParameter &&
5729
- getConstraintOfTypeParameter(<TypeParameter>keyType) === getPropertyNameType (objectType)) {
5730
- return getPropertyAccessType (objectType, keyType);
5729
+ getConstraintOfTypeParameter(<TypeParameter>keyType) === getIndexType (objectType)) {
5730
+ return getIndexedAccessType (objectType, keyType);
5731
5731
}
5732
5732
if (isTypeOfKind(keyType, TypeFlags.StringLiteral) && !(keyType.flags & TypeFlags.Intersection)) {
5733
5733
const missing = forEachType(keyType, t => getTypeOfPropertyOfType(objectType, escapeIdentifier((<LiteralType>t).text)) ? undefined : (<LiteralType>t).text);
5734
5734
if (missing) {
5735
- error(node.keyType , Diagnostics.Property_0_is_missing_in_type_1, missing, typeToString(objectType));
5735
+ error(node.indexType , Diagnostics.Property_0_is_missing_in_type_1, missing, typeToString(objectType));
5736
5736
return unknownType;
5737
5737
}
5738
- return getPropertyAccessType (objectType, keyType);
5738
+ return getIndexedAccessType (objectType, keyType);
5739
5739
}
5740
- error(node.keyType , Diagnostics.Property_access_element_type_must_be_a_string_literal_type_or_a_type_parameter_constrained_to_keyof_0, typeToString(objectType));
5740
+ error(node.indexType , Diagnostics.Property_access_element_type_must_be_a_string_literal_type_or_a_type_parameter_constrained_to_keyof_0, typeToString(objectType));
5741
5741
return unknownType;
5742
5742
}
5743
5743
5744
- function getTypeFromPropertyAccessTypeNode (node: PropertyAccessTypeNode ) {
5744
+ function getTypeFromIndexedAccessTypeNode (node: IndexedAccessTypeNode ) {
5745
5745
const links = getNodeLinks(node);
5746
5746
if (!links.resolvedType) {
5747
- links.resolvedType = resolvePropertyAccessTypeNode (node);
5747
+ links.resolvedType = resolveIndexedAccessTypeNode (node);
5748
5748
}
5749
5749
return links.resolvedType;
5750
5750
}
@@ -5910,8 +5910,8 @@ namespace ts {
5910
5910
return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node, aliasSymbol, aliasTypeArguments);
5911
5911
case SyntaxKind.TypeOperator:
5912
5912
return getTypeFromTypeOperatorNode(<TypeOperatorNode>node);
5913
- case SyntaxKind.PropertyAccessType :
5914
- return getTypeFromPropertyAccessTypeNode(<PropertyAccessTypeNode >node);
5913
+ case SyntaxKind.IndexedAccessType :
5914
+ return getTypeFromIndexedAccessTypeNode(<IndexedAccessTypeNode >node);
5915
5915
// This function assumes that an identifier or qualified name is a type expression
5916
5916
// Callers should first ensure this by calling isTypeNode
5917
5917
case SyntaxKind.Identifier:
@@ -6173,11 +6173,11 @@ namespace ts {
6173
6173
if (type.flags & TypeFlags.Intersection) {
6174
6174
return getIntersectionType(instantiateList((<IntersectionType>type).types, mapper, instantiateType), type.aliasSymbol, mapper.targetTypes);
6175
6175
}
6176
- if (type.flags & TypeFlags.PropertyName ) {
6177
- return getPropertyNameType (instantiateType((<PropertyNameType >type).type, mapper));
6176
+ if (type.flags & TypeFlags.Index ) {
6177
+ return getIndexType (instantiateType((<IndexType >type).type, mapper));
6178
6178
}
6179
- if (type.flags & TypeFlags.PropertyAccess ) {
6180
- return getPropertyAccessType (instantiateType((<PropertyAccessType >type).objectType, mapper), instantiateType((<PropertyAccessType >type).keyType , mapper));
6179
+ if (type.flags & TypeFlags.IndexedAccess ) {
6180
+ return getIndexedAccessType (instantiateType((<IndexedAccessType >type).objectType, mapper), instantiateType((<IndexedAccessType >type).indexType , mapper));
6181
6181
}
6182
6182
}
6183
6183
return type;
@@ -8114,7 +8114,7 @@ namespace ts {
8114
8114
8115
8115
function hasPrimitiveConstraint(type: TypeParameter): boolean {
8116
8116
const constraint = getConstraintOfTypeParameter(type);
8117
- return constraint && maybeTypeOfKind(constraint, TypeFlags.Primitive | TypeFlags.PropertyName );
8117
+ return constraint && maybeTypeOfKind(constraint, TypeFlags.Primitive | TypeFlags.Index );
8118
8118
}
8119
8119
8120
8120
function getInferredType(context: InferenceContext, index: number): Type {
@@ -11520,14 +11520,20 @@ namespace ts {
11520
11520
}
11521
11521
}
11522
11522
11523
- // Obtain base constraint such that we can bail out if the constraint is an unknown type
11524
- const objectType = getApparentType(checkNonNullExpression(node.expression));
11523
+ let objectType = checkNonNullExpression(node.expression);
11525
11524
const indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
11526
11525
11527
11526
if (objectType === unknownType || objectType === silentNeverType) {
11528
11527
return objectType;
11529
11528
}
11530
11529
11530
+ if (indexType.flags & TypeFlags.TypeParameter &&
11531
+ isTypeAssignableTo(getConstraintOfTypeParameter(<TypeParameter>indexType), getIndexType(objectType))) {
11532
+ return getIndexedAccessType(objectType, indexType);
11533
+ }
11534
+
11535
+ objectType = getApparentType(objectType);
11536
+
11531
11537
const isConstEnum = isConstEnumObjectType(objectType);
11532
11538
if (isConstEnum &&
11533
11539
(!node.argumentExpression || node.argumentExpression.kind !== SyntaxKind.StringLiteral)) {
@@ -15043,6 +15049,10 @@ namespace ts {
15043
15049
forEach(node.types, checkSourceElement);
15044
15050
}
15045
15051
15052
+ function checkIndexedAccessType(node: IndexedAccessTypeNode) {
15053
+ getTypeFromIndexedAccessTypeNode(node);
15054
+ }
15055
+
15046
15056
function isPrivateWithinAmbient(node: Node): boolean {
15047
15057
return (getModifierFlags(node) & ModifierFlags.Private) && isInAmbientContext(node);
15048
15058
}
@@ -18327,6 +18337,8 @@ namespace ts {
18327
18337
case SyntaxKind.ParenthesizedType:
18328
18338
case SyntaxKind.TypeOperator:
18329
18339
return checkSourceElement((<ParenthesizedTypeNode | TypeOperatorNode>node).type);
18340
+ case SyntaxKind.IndexedAccessType:
18341
+ return checkIndexedAccessType(<IndexedAccessTypeNode>node);
18330
18342
case SyntaxKind.FunctionDeclaration:
18331
18343
return checkFunctionDeclaration(<FunctionDeclaration>node);
18332
18344
case SyntaxKind.Block:
0 commit comments