Skip to content

Commit ad4f83a

Browse files
committed
Merge branch 'master' into fixIndexTypeTargetConstraint
# Conflicts: # tests/baselines/reference/keyofAndIndexedAccess.js # tests/baselines/reference/keyofAndIndexedAccess.symbols # tests/baselines/reference/keyofAndIndexedAccess.types # tests/cases/conformance/types/keyof/keyofAndIndexedAccess.ts
2 parents 08c288d + 5d67f8e commit ad4f83a

35 files changed

+760
-276
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8268,7 +8268,8 @@ namespace ts {
82688268
}
82698269

82708270
function getIndexType(type: Type, stringsOnly = keyofStringsOnly): Type {
8271-
return type.flags & TypeFlags.Intersection ? getUnionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly))) :
8271+
return type.flags & TypeFlags.Union ? getIntersectionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly))) :
8272+
type.flags & TypeFlags.Intersection ? getUnionType(map((<IntersectionType>type).types, t => getIndexType(t, stringsOnly))) :
82728273
maybeTypeOfKind(type, TypeFlags.InstantiableNonPrimitive) ? getIndexTypeForGenericType(<InstantiableType | UnionOrIntersectionType>type, stringsOnly) :
82738274
getObjectFlags(type) & ObjectFlags.Mapped ? getConstraintTypeFromMappedType(<MappedType>type) :
82748275
type === wildcardType ? wildcardType :
@@ -22186,7 +22187,8 @@ namespace ts {
2218622187
}
2218722188

2218822189
if (!isRemovedPropertyFromObjectSpread(node.kind === SyntaxKind.Identifier ? node.parent : node)) {
22189-
addDiagnostic(UnusedKind.Local, createDiagnosticForNodeSpan(getSourceFileOfNode(declaration), declaration, node, Diagnostics._0_is_declared_but_its_value_is_never_read, name));
22190+
const message = isTypeDeclaration(declaration) ? Diagnostics._0_is_declared_but_never_used : Diagnostics._0_is_declared_but_its_value_is_never_read;
22191+
addDiagnostic(UnusedKind.Local, createDiagnosticForNodeSpan(getSourceFileOfNode(declaration), declaration, node, message, name));
2219022192
}
2219122193
}
2219222194

src/compiler/diagnosticMessages.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3530,6 +3530,11 @@
35303530
"category": "Message",
35313531
"code": 6195
35323532
},
3533+
"'{0}' is declared but never used.": {
3534+
"category": "Error",
3535+
"code": 6196,
3536+
"reportsUnnecessary": true
3537+
},
35333538
"Variable '{0}' implicitly has an '{1}' type.": {
35343539
"category": "Error",
35353540
"code": 7005

src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,9 @@
906906
<Item ItemId=";Add_0_to_unresolved_variable_90008" ItemType="0" PsrId="306" Leaf="true">
907907
<Str Cat="Text">
908908
<Val><![CDATA[Add '{0}.' to unresolved variable]]></Val>
909+
<Tgt Cat="Text" Stat="Loc" Orig="New">
910+
<Val><![CDATA[對未解析的變數新增 '{0}.']]></Val>
911+
</Tgt>
909912
</Str>
910913
<Disp Icon="Str" />
911914
</Item>
@@ -1008,6 +1011,9 @@
10081011
<Item ItemId=";Add_qualifier_to_all_unresolved_variables_matching_a_member_name_95037" ItemType="0" PsrId="306" Leaf="true">
10091012
<Str Cat="Text">
10101013
<Val><![CDATA[Add qualifier to all unresolved variables matching a member name]]></Val>
1014+
<Tgt Cat="Text" Stat="Loc" Orig="New">
1015+
<Val><![CDATA[對所有比對成員名稱的未解析變數新增限定詞]]></Val>
1016+
</Tgt>
10111017
</Str>
10121018
<Disp Icon="Str" />
10131019
</Item>
@@ -6498,6 +6504,12 @@
64986504
</Str>
64996505
<Disp Icon="Str" />
65006506
</Item>
6507+
<Item ItemId=";Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195" ItemType="0" PsrId="306" Leaf="true">
6508+
<Str Cat="Text">
6509+
<Val><![CDATA[Resolve 'keyof' to string valued property names only (no numbers or symbols).]]></Val>
6510+
</Str>
6511+
<Disp Icon="Str" />
6512+
</Item>
65016513
<Item ItemId=";Resolving_from_node_modules_folder_6118" ItemType="0" PsrId="306" Leaf="true">
65026514
<Str Cat="Text">
65036515
<Val><![CDATA[Resolving from node_modules folder...]]></Val>

src/loc/lcl/fra/diagnosticMessages/diagnosticMessages.generated.json.lcl

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,15 @@
912912
</Str>
913913
<Disp Icon="Str" />
914914
</Item>
915+
<Item ItemId=";Add_0_to_unresolved_variable_90008" ItemType="0" PsrId="306" Leaf="true">
916+
<Str Cat="Text">
917+
<Val><![CDATA[Add '{0}.' to unresolved variable]]></Val>
918+
<Tgt Cat="Text" Stat="Loc" Orig="New">
919+
<Val><![CDATA[Ajouter '{0}.' à la variable non résolue]]></Val>
920+
</Tgt>
921+
</Str>
922+
<Disp Icon="Str" />
923+
</Item>
915924
<Item ItemId=";Add_all_missing_async_modifiers_95041" ItemType="0" PsrId="306" Leaf="true">
916925
<Str Cat="Text">
917926
<Val><![CDATA[Add all missing 'async' modifiers]]></Val>
@@ -1008,24 +1017,12 @@
10081017
</Str>
10091018
<Disp Icon="Str" />
10101019
</Item>
1011-
<Item ItemId=";Add_this_to_all_unresolved_variables_matching_a_member_name_95037" ItemType="0" PsrId="306" Leaf="true">
1012-
<Str Cat="Text">
1013-
<Val><![CDATA[Add 'this.' to all unresolved variables matching a member name]]></Val>
1014-
<Tgt Cat="Text" Stat="Loc" Orig="New">
1015-
<Val><![CDATA[Ajouter 'this.' à toutes les variables non résolues correspondant à un nom de membre]]></Val>
1016-
</Tgt>
1017-
</Str>
1018-
<Disp Icon="Str" />
1019-
</Item>
1020-
<Item ItemId=";Add_this_to_unresolved_variable_90008" ItemType="0" PsrId="306" Leaf="true">
1020+
<Item ItemId=";Add_qualifier_to_all_unresolved_variables_matching_a_member_name_95037" ItemType="0" PsrId="306" Leaf="true">
10211021
<Str Cat="Text">
1022-
<Val><![CDATA[Add 'this.' to unresolved variable]]></Val>
1022+
<Val><![CDATA[Add qualifier to all unresolved variables matching a member name]]></Val>
10231023
<Tgt Cat="Text" Stat="Loc" Orig="New">
1024-
<Val><![CDATA[Ajouter 'this.' à la variable non résolue]]></Val>
1024+
<Val><![CDATA[Ajouter un qualificateur à toutes les variables non résolues correspondant à un nom de membre]]></Val>
10251025
</Tgt>
1026-
<Prev Cat="Text">
1027-
<Val><![CDATA[Add 'this.' to unresolved variable.]]></Val>
1028-
</Prev>
10291026
</Str>
10301027
<Disp Icon="Str" />
10311028
</Item>
@@ -6516,6 +6513,12 @@
65166513
</Str>
65176514
<Disp Icon="Str" />
65186515
</Item>
6516+
<Item ItemId=";Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195" ItemType="0" PsrId="306" Leaf="true">
6517+
<Str Cat="Text">
6518+
<Val><![CDATA[Resolve 'keyof' to string valued property names only (no numbers or symbols).]]></Val>
6519+
</Str>
6520+
<Disp Icon="Str" />
6521+
</Item>
65196522
<Item ItemId=";Resolving_from_node_modules_folder_6118" ItemType="0" PsrId="306" Leaf="true">
65206523
<Str Cat="Text">
65216524
<Val><![CDATA[Resolving from node_modules folder...]]></Val>

src/loc/lcl/jpn/diagnosticMessages/diagnosticMessages.generated.json.lcl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,9 @@
906906
<Item ItemId=";Add_0_to_unresolved_variable_90008" ItemType="0" PsrId="306" Leaf="true">
907907
<Str Cat="Text">
908908
<Val><![CDATA[Add '{0}.' to unresolved variable]]></Val>
909+
<Tgt Cat="Text" Stat="Loc" Orig="New">
910+
<Val><![CDATA['{0}' を未解決の変数に追加します]]></Val>
911+
</Tgt>
909912
</Str>
910913
<Disp Icon="Str" />
911914
</Item>
@@ -1008,6 +1011,9 @@
10081011
<Item ItemId=";Add_qualifier_to_all_unresolved_variables_matching_a_member_name_95037" ItemType="0" PsrId="306" Leaf="true">
10091012
<Str Cat="Text">
10101013
<Val><![CDATA[Add qualifier to all unresolved variables matching a member name]]></Val>
1014+
<Tgt Cat="Text" Stat="Loc" Orig="New">
1015+
<Val><![CDATA[メンバー名と一致するすべての未解決の変数に修飾子を追加します]]></Val>
1016+
</Tgt>
10111017
</Str>
10121018
<Disp Icon="Str" />
10131019
</Item>
@@ -6498,6 +6504,12 @@
64986504
</Str>
64996505
<Disp Icon="Str" />
65006506
</Item>
6507+
<Item ItemId=";Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195" ItemType="0" PsrId="306" Leaf="true">
6508+
<Str Cat="Text">
6509+
<Val><![CDATA[Resolve 'keyof' to string valued property names only (no numbers or symbols).]]></Val>
6510+
</Str>
6511+
<Disp Icon="Str" />
6512+
</Item>
65016513
<Item ItemId=";Resolving_from_node_modules_folder_6118" ItemType="0" PsrId="306" Leaf="true">
65026514
<Str Cat="Text">
65036515
<Val><![CDATA[Resolving from node_modules folder...]]></Val>

src/loc/lcl/rus/diagnosticMessages/diagnosticMessages.generated.json.lcl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,9 @@
905905
<Item ItemId=";Add_0_to_unresolved_variable_90008" ItemType="0" PsrId="306" Leaf="true">
906906
<Str Cat="Text">
907907
<Val><![CDATA[Add '{0}.' to unresolved variable]]></Val>
908+
<Tgt Cat="Text" Stat="Loc" Orig="New">
909+
<Val><![CDATA[Добавить "{0}." к неразрешенной переменной]]></Val>
910+
</Tgt>
908911
</Str>
909912
<Disp Icon="Str" />
910913
</Item>
@@ -6497,6 +6500,12 @@
64976500
</Str>
64986501
<Disp Icon="Str" />
64996502
</Item>
6503+
<Item ItemId=";Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195" ItemType="0" PsrId="306" Leaf="true">
6504+
<Str Cat="Text">
6505+
<Val><![CDATA[Resolve 'keyof' to string valued property names only (no numbers or symbols).]]></Val>
6506+
</Str>
6507+
<Disp Icon="Str" />
6508+
</Item>
65006509
<Item ItemId=";Resolving_from_node_modules_folder_6118" ItemType="0" PsrId="306" Leaf="true">
65016510
<Str Cat="Text">
65026511
<Val><![CDATA[Resolving from node_modules folder...]]></Val>

src/services/codefixes/fixUnusedIdentifier.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace ts.codefix {
55
const fixIdDelete = "unusedIdentifier_delete";
66
const errorCodes = [
77
Diagnostics._0_is_declared_but_its_value_is_never_read.code,
8+
Diagnostics._0_is_declared_but_never_used.code,
89
Diagnostics.Property_0_is_declared_but_its_value_is_never_read.code,
910
Diagnostics.All_imports_in_import_declaration_are_unused.code,
1011
];

src/services/codefixes/importFixes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ namespace ts.codefix {
77
Diagnostics.Cannot_find_name_0.code,
88
Diagnostics.Cannot_find_name_0_Did_you_mean_1.code,
99
Diagnostics.Cannot_find_namespace_0.code,
10-
Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code
10+
Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code,
11+
Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here.code,
1112
],
1213
getCodeActions: getImportCodeActions,
1314
// TODO: GH#20315

src/services/goToDefinition.ts

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,22 @@ namespace ts.GoToDefinition {
1818
}
1919

2020
const typeChecker = program.getTypeChecker();
21-
22-
const calledDeclaration = tryGetSignatureDeclaration(typeChecker, node);
23-
if (calledDeclaration) {
24-
return [createDefinitionFromSignatureDeclaration(typeChecker, calledDeclaration)];
25-
}
26-
27-
let symbol = typeChecker.getSymbolAtLocation(node);
21+
const symbol = getSymbol(node, typeChecker);
2822

2923
// Could not find a symbol e.g. node is string or number keyword,
3024
// or the symbol was an internal symbol and does not have a declaration e.g. undefined symbol
3125
if (!symbol) {
3226
return getDefinitionInfoForIndexSignatures(node, typeChecker);
3327
}
3428

35-
// If this is an alias, and the request came at the declaration location
36-
// get the aliased symbol instead. This allows for goto def on an import e.g.
37-
// import {A, B} from "mod";
38-
// to jump to the implementation directly.
39-
if (symbol.flags & SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) {
40-
const aliased = typeChecker.getAliasedSymbol(symbol);
41-
if (aliased.declarations) {
42-
symbol = aliased;
43-
}
29+
const calledDeclaration = tryGetSignatureDeclaration(typeChecker, node);
30+
if (calledDeclaration) {
31+
const sigInfo = createDefinitionFromSignatureDeclaration(typeChecker, calledDeclaration);
32+
// For a function, if this is the original function definition, return just sigInfo.
33+
// If this is the original constructor definition, parent is the class.
34+
return typeChecker.getRootSymbols(symbol).some(s => calledDeclaration.symbol === s || calledDeclaration.symbol.parent === s)
35+
? [sigInfo]
36+
: [sigInfo, ...getDefinitionFromSymbol(typeChecker, symbol, node)];
4437
}
4538

4639
// Because name in short-hand property assignment has two different meanings: property name and property value,
@@ -158,6 +151,21 @@ namespace ts.GoToDefinition {
158151
});
159152
}
160153

154+
function getSymbol(node: Node, checker: TypeChecker): Symbol | undefined {
155+
const symbol = checker.getSymbolAtLocation(node);
156+
// If this is an alias, and the request came at the declaration location
157+
// get the aliased symbol instead. This allows for goto def on an import e.g.
158+
// import {A, B} from "mod";
159+
// to jump to the implementation directly.
160+
if (symbol && symbol.flags & SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) {
161+
const aliased = checker.getAliasedSymbol(symbol);
162+
if (aliased.declarations) {
163+
return aliased;
164+
}
165+
}
166+
return symbol;
167+
}
168+
161169
// Go to the original declaration for cases:
162170
//
163171
// (1) when the aliased symbol was declared in the location(parent).

tests/baselines/reference/keyofAndIndexedAccess.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,24 @@ type Result = Example<{ a: { prop: string }; b: { prop: number } }>;
574574
type Helper2<T> = { [K in keyof T]: Extract<T[K], { prop: any }> };
575575
type Example2<T> = { [K in keyof Helper2<T>]: Helper2<T>[K]["prop"] };
576576
type Result2 = Example2<{ 1: { prop: string }; 2: { prop: number } }>;
577+
578+
// Repro from #23618
579+
580+
type DBBoolTable<K extends string> = { [k in K]: 0 | 1 }
581+
enum Flag {
582+
FLAG_1 = "flag_1",
583+
FLAG_2 = "flag_2"
584+
}
585+
586+
type SimpleDBRecord<Flag extends string> = { staticField: number } & DBBoolTable<Flag>
587+
function getFlagsFromSimpleRecord<Flag extends string>(record: SimpleDBRecord<Flag>, flags: Flag[]) {
588+
return record[flags[0]];
589+
}
590+
591+
type DynamicDBRecord<Flag extends string> = ({ dynamicField: number } | { dynamicField: string }) & DBBoolTable<Flag>
592+
function getFlagsFromDynamicRecord<Flag extends string>(record: DynamicDBRecord<Flag>, flags: Flag[]) {
593+
return record[flags[0]];
594+
}
577595

578596

579597
//// [keyofAndIndexedAccess.js]
@@ -957,6 +975,17 @@ function f3(t, k, tk) {
957975
t[key] = tk; // ok, T[K] ==> T[keyof T]
958976
}
959977
}
978+
var Flag;
979+
(function (Flag) {
980+
Flag["FLAG_1"] = "flag_1";
981+
Flag["FLAG_2"] = "flag_2";
982+
})(Flag || (Flag = {}));
983+
function getFlagsFromSimpleRecord(record, flags) {
984+
return record[flags[0]];
985+
}
986+
function getFlagsFromDynamicRecord(record, flags) {
987+
return record[flags[0]];
988+
}
960989

961990

962991
//// [keyofAndIndexedAccess.d.ts]
@@ -1252,3 +1281,20 @@ declare type Result2 = Example2<{
12521281
prop: number;
12531282
};
12541283
}>;
1284+
declare type DBBoolTable<K extends string> = {
1285+
[k in K]: 0 | 1;
1286+
};
1287+
declare enum Flag {
1288+
FLAG_1 = "flag_1",
1289+
FLAG_2 = "flag_2"
1290+
}
1291+
declare type SimpleDBRecord<Flag extends string> = {
1292+
staticField: number;
1293+
} & DBBoolTable<Flag>;
1294+
declare function getFlagsFromSimpleRecord<Flag extends string>(record: SimpleDBRecord<Flag>, flags: Flag[]): SimpleDBRecord<Flag>[Flag];
1295+
declare type DynamicDBRecord<Flag extends string> = ({
1296+
dynamicField: number;
1297+
} | {
1298+
dynamicField: string;
1299+
}) & DBBoolTable<Flag>;
1300+
declare function getFlagsFromDynamicRecord<Flag extends string>(record: DynamicDBRecord<Flag>, flags: Flag[]): DynamicDBRecord<Flag>[Flag];

tests/baselines/reference/keyofAndIndexedAccess.symbols

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2059,3 +2059,64 @@ type Result2 = Example2<{ 1: { prop: string }; 2: { prop: number } }>;
20592059
>2 : Symbol(2, Decl(keyofAndIndexedAccess.ts, 574, 46))
20602060
>prop : Symbol(prop, Decl(keyofAndIndexedAccess.ts, 574, 51))
20612061

2062+
// Repro from #23618
2063+
2064+
type DBBoolTable<K extends string> = { [k in K]: 0 | 1 }
2065+
>DBBoolTable : Symbol(DBBoolTable, Decl(keyofAndIndexedAccess.ts, 574, 70))
2066+
>K : Symbol(K, Decl(keyofAndIndexedAccess.ts, 578, 17))
2067+
>k : Symbol(k, Decl(keyofAndIndexedAccess.ts, 578, 40))
2068+
>K : Symbol(K, Decl(keyofAndIndexedAccess.ts, 578, 17))
2069+
2070+
enum Flag {
2071+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 578, 56))
2072+
2073+
FLAG_1 = "flag_1",
2074+
>FLAG_1 : Symbol(Flag.FLAG_1, Decl(keyofAndIndexedAccess.ts, 579, 11))
2075+
2076+
FLAG_2 = "flag_2"
2077+
>FLAG_2 : Symbol(Flag.FLAG_2, Decl(keyofAndIndexedAccess.ts, 580, 22))
2078+
}
2079+
2080+
type SimpleDBRecord<Flag extends string> = { staticField: number } & DBBoolTable<Flag>
2081+
>SimpleDBRecord : Symbol(SimpleDBRecord, Decl(keyofAndIndexedAccess.ts, 582, 1))
2082+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 584, 20))
2083+
>staticField : Symbol(staticField, Decl(keyofAndIndexedAccess.ts, 584, 44))
2084+
>DBBoolTable : Symbol(DBBoolTable, Decl(keyofAndIndexedAccess.ts, 574, 70))
2085+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 584, 20))
2086+
2087+
function getFlagsFromSimpleRecord<Flag extends string>(record: SimpleDBRecord<Flag>, flags: Flag[]) {
2088+
>getFlagsFromSimpleRecord : Symbol(getFlagsFromSimpleRecord, Decl(keyofAndIndexedAccess.ts, 584, 86))
2089+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 585, 34))
2090+
>record : Symbol(record, Decl(keyofAndIndexedAccess.ts, 585, 55))
2091+
>SimpleDBRecord : Symbol(SimpleDBRecord, Decl(keyofAndIndexedAccess.ts, 582, 1))
2092+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 585, 34))
2093+
>flags : Symbol(flags, Decl(keyofAndIndexedAccess.ts, 585, 84))
2094+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 585, 34))
2095+
2096+
return record[flags[0]];
2097+
>record : Symbol(record, Decl(keyofAndIndexedAccess.ts, 585, 55))
2098+
>flags : Symbol(flags, Decl(keyofAndIndexedAccess.ts, 585, 84))
2099+
}
2100+
2101+
type DynamicDBRecord<Flag extends string> = ({ dynamicField: number } | { dynamicField: string }) & DBBoolTable<Flag>
2102+
>DynamicDBRecord : Symbol(DynamicDBRecord, Decl(keyofAndIndexedAccess.ts, 587, 1))
2103+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 589, 21))
2104+
>dynamicField : Symbol(dynamicField, Decl(keyofAndIndexedAccess.ts, 589, 46))
2105+
>dynamicField : Symbol(dynamicField, Decl(keyofAndIndexedAccess.ts, 589, 73))
2106+
>DBBoolTable : Symbol(DBBoolTable, Decl(keyofAndIndexedAccess.ts, 574, 70))
2107+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 589, 21))
2108+
2109+
function getFlagsFromDynamicRecord<Flag extends string>(record: DynamicDBRecord<Flag>, flags: Flag[]) {
2110+
>getFlagsFromDynamicRecord : Symbol(getFlagsFromDynamicRecord, Decl(keyofAndIndexedAccess.ts, 589, 117))
2111+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 590, 35))
2112+
>record : Symbol(record, Decl(keyofAndIndexedAccess.ts, 590, 56))
2113+
>DynamicDBRecord : Symbol(DynamicDBRecord, Decl(keyofAndIndexedAccess.ts, 587, 1))
2114+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 590, 35))
2115+
>flags : Symbol(flags, Decl(keyofAndIndexedAccess.ts, 590, 86))
2116+
>Flag : Symbol(Flag, Decl(keyofAndIndexedAccess.ts, 590, 35))
2117+
2118+
return record[flags[0]];
2119+
>record : Symbol(record, Decl(keyofAndIndexedAccess.ts, 590, 56))
2120+
>flags : Symbol(flags, Decl(keyofAndIndexedAccess.ts, 590, 86))
2121+
}
2122+

0 commit comments

Comments
 (0)