Skip to content

Commit 026549e

Browse files
committed
Change keyof ts to actually exhibit behaviour
1 parent 3f103f5 commit 026549e

File tree

4 files changed

+48
-100
lines changed

4 files changed

+48
-100
lines changed

tests/baselines/reference/narrowingByTypeofInSwitch.js

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ function assertAll(x: Basic) {
3939
return x;
4040
}
4141

42-
function assertStringOrNumber(x: string | number) {
42+
function assertStringOrNumber(x: string | number) {
4343
return x;
4444
}
4545

46-
function assertBooleanOrObject(x: boolean | object) {
46+
function assertBooleanOrObject(x: boolean | object) {
4747
return x;
4848
}
4949

@@ -227,16 +227,12 @@ function unknownNarrowing(x: unknown) {
227227
}
228228
}
229229

230-
function keyofNarrowing<T>(k: keyof T) {
231-
function assertKeyofT(k1: keyof T) { }
230+
function keyofNarrowing<S extends { [K in keyof S]: string }>(k: keyof S) {
231+
function assertKeyofT(k1: keyof S) { }
232232
switch (typeof k) {
233233
case 'number': assertNumber(k); assertKeyofT(k); return;
234234
case 'symbol': assertSymbol(k); assertKeyofT(k); return;
235235
case 'string': assertString(k); assertKeyofT(k); return;
236-
case 'boolean': assertNever(k);
237-
case 'function': assertNever(k);
238-
case 'object': assertNever(k);
239-
case 'undefined': assertNever(k); return;
240236
}
241237
}
242238

@@ -542,11 +538,5 @@ function keyofNarrowing(k) {
542538
assertString(k);
543539
assertKeyofT(k);
544540
return;
545-
case 'boolean': assertNever(k);
546-
case 'function': assertNever(k);
547-
case 'object': assertNever(k);
548-
case 'undefined':
549-
assertNever(k);
550-
return;
551541
}
552542
}

tests/baselines/reference/narrowingByTypeofInSwitch.symbols

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,15 @@ function assertAll(x: Basic) {
8181
>x : Symbol(x, Decl(narrowingByTypeofInSwitch.ts, 36, 19))
8282
}
8383

84-
function assertStringOrNumber(x: string | number) {
84+
function assertStringOrNumber(x: string | number) {
8585
>assertStringOrNumber : Symbol(assertStringOrNumber, Decl(narrowingByTypeofInSwitch.ts, 38, 1))
8686
>x : Symbol(x, Decl(narrowingByTypeofInSwitch.ts, 40, 30))
8787

8888
return x;
8989
>x : Symbol(x, Decl(narrowingByTypeofInSwitch.ts, 40, 30))
9090
}
9191

92-
function assertBooleanOrObject(x: boolean | object) {
92+
function assertBooleanOrObject(x: boolean | object) {
9393
>assertBooleanOrObject : Symbol(assertBooleanOrObject, Decl(narrowingByTypeofInSwitch.ts, 42, 1))
9494
>x : Symbol(x, Decl(narrowingByTypeofInSwitch.ts, 44, 31))
9595

@@ -634,53 +634,39 @@ function unknownNarrowing(x: unknown) {
634634
}
635635
}
636636

637-
function keyofNarrowing<T>(k: keyof T) {
637+
function keyofNarrowing<S extends { [K in keyof S]: string }>(k: keyof S) {
638638
>keyofNarrowing : Symbol(keyofNarrowing, Decl(narrowingByTypeofInSwitch.ts, 226, 1))
639-
>T : Symbol(T, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
640-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
641-
>T : Symbol(T, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
642-
643-
function assertKeyofT(k1: keyof T) { }
644-
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 40))
639+
>S : Symbol(S, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
640+
>K : Symbol(K, Decl(narrowingByTypeofInSwitch.ts, 228, 37))
641+
>S : Symbol(S, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
642+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
643+
>S : Symbol(S, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
644+
645+
function assertKeyofT(k1: keyof S) { }
646+
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 75))
645647
>k1 : Symbol(k1, Decl(narrowingByTypeofInSwitch.ts, 229, 26))
646-
>T : Symbol(T, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
648+
>S : Symbol(S, Decl(narrowingByTypeofInSwitch.ts, 228, 24))
647649

648650
switch (typeof k) {
649-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
651+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
650652

651653
case 'number': assertNumber(k); assertKeyofT(k); return;
652654
>assertNumber : Symbol(assertNumber, Decl(narrowingByTypeofInSwitch.ts, 2, 1))
653-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
654-
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 40))
655-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
655+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
656+
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 75))
657+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
656658

657659
case 'symbol': assertSymbol(k); assertKeyofT(k); return;
658660
>assertSymbol : Symbol(assertSymbol, Decl(narrowingByTypeofInSwitch.ts, 14, 1))
659-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
660-
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 40))
661-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
661+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
662+
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 75))
663+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
662664

663665
case 'string': assertString(k); assertKeyofT(k); return;
664666
>assertString : Symbol(assertString, Decl(narrowingByTypeofInSwitch.ts, 10, 1))
665-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
666-
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 40))
667-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
668-
669-
case 'boolean': assertNever(k);
670-
>assertNever : Symbol(assertNever, Decl(narrowingByTypeofInSwitch.ts, 0, 0))
671-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
672-
673-
case 'function': assertNever(k);
674-
>assertNever : Symbol(assertNever, Decl(narrowingByTypeofInSwitch.ts, 0, 0))
675-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
676-
677-
case 'object': assertNever(k);
678-
>assertNever : Symbol(assertNever, Decl(narrowingByTypeofInSwitch.ts, 0, 0))
679-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
680-
681-
case 'undefined': assertNever(k); return;
682-
>assertNever : Symbol(assertNever, Decl(narrowingByTypeofInSwitch.ts, 0, 0))
683-
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 27))
667+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
668+
>assertKeyofT : Symbol(assertKeyofT, Decl(narrowingByTypeofInSwitch.ts, 228, 75))
669+
>k : Symbol(k, Decl(narrowingByTypeofInSwitch.ts, 228, 62))
684670
}
685671
}
686672

tests/baselines/reference/narrowingByTypeofInSwitch.types

Lines changed: 18 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ function assertAll(x: Basic) {
8080
>x : Basic
8181
}
8282

83-
function assertStringOrNumber(x: string | number) {
83+
function assertStringOrNumber(x: string | number) {
8484
>assertStringOrNumber : (x: string | number) => string | number
8585
>x : string | number
8686

8787
return x;
8888
>x : string | number
8989
}
9090

91-
function assertBooleanOrObject(x: boolean | object) {
91+
function assertBooleanOrObject(x: boolean | object) {
9292
>assertBooleanOrObject : (x: boolean | object) => boolean | object
9393
>x : boolean | object
9494

@@ -767,68 +767,44 @@ function unknownNarrowing(x: unknown) {
767767
}
768768
}
769769

770-
function keyofNarrowing<T>(k: keyof T) {
771-
>keyofNarrowing : <T>(k: keyof T) => void
772-
>k : keyof T
770+
function keyofNarrowing<S extends { [K in keyof S]: string }>(k: keyof S) {
771+
>keyofNarrowing : <S extends { [K in keyof S]: string; }>(k: keyof S) => void
772+
>k : keyof S
773773

774-
function assertKeyofT(k1: keyof T) { }
775-
>assertKeyofT : (k1: keyof T) => void
776-
>k1 : keyof T
774+
function assertKeyofT(k1: keyof S) { }
775+
>assertKeyofT : (k1: keyof S) => void
776+
>k1 : keyof S
777777

778778
switch (typeof k) {
779779
>typeof k : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"
780-
>k : keyof T
780+
>k : keyof S
781781

782782
case 'number': assertNumber(k); assertKeyofT(k); return;
783783
>'number' : "number"
784784
>assertNumber(k) : number
785785
>assertNumber : (x: number) => number
786-
>k : keyof T & number
786+
>k : keyof S & number
787787
>assertKeyofT(k) : void
788-
>assertKeyofT : (k1: keyof T) => void
789-
>k : keyof T & number
788+
>assertKeyofT : (k1: keyof S) => void
789+
>k : keyof S & number
790790

791791
case 'symbol': assertSymbol(k); assertKeyofT(k); return;
792792
>'symbol' : "symbol"
793793
>assertSymbol(k) : symbol
794794
>assertSymbol : (x: symbol) => symbol
795-
>k : keyof T & symbol
795+
>k : keyof S & symbol
796796
>assertKeyofT(k) : void
797-
>assertKeyofT : (k1: keyof T) => void
798-
>k : keyof T & symbol
797+
>assertKeyofT : (k1: keyof S) => void
798+
>k : keyof S & symbol
799799

800800
case 'string': assertString(k); assertKeyofT(k); return;
801801
>'string' : "string"
802802
>assertString(k) : string
803803
>assertString : (x: string) => string
804-
>k : keyof T & string
804+
>k : keyof S & string
805805
>assertKeyofT(k) : void
806-
>assertKeyofT : (k1: keyof T) => void
807-
>k : keyof T & string
808-
809-
case 'boolean': assertNever(k);
810-
>'boolean' : "boolean"
811-
>assertNever(k) : never
812-
>assertNever : (x: never) => never
813-
>k : never
814-
815-
case 'function': assertNever(k);
816-
>'function' : "function"
817-
>assertNever(k) : never
818-
>assertNever : (x: never) => never
819-
>k : never
820-
821-
case 'object': assertNever(k);
822-
>'object' : "object"
823-
>assertNever(k) : never
824-
>assertNever : (x: never) => never
825-
>k : never
826-
827-
case 'undefined': assertNever(k); return;
828-
>'undefined' : "undefined"
829-
>assertNever(k) : never
830-
>assertNever : (x: never) => never
831-
>k : never
806+
>assertKeyofT : (k1: keyof S) => void
807+
>k : keyof S & string
832808
}
833809
}
834810

tests/cases/compiler/narrowingByTypeofInSwitch.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ function assertAll(x: Basic) {
4141
return x;
4242
}
4343

44-
function assertStringOrNumber(x: string | number) {
44+
function assertStringOrNumber(x: string | number) {
4545
return x;
4646
}
4747

48-
function assertBooleanOrObject(x: boolean | object) {
48+
function assertBooleanOrObject(x: boolean | object) {
4949
return x;
5050
}
5151

@@ -229,15 +229,11 @@ function unknownNarrowing(x: unknown) {
229229
}
230230
}
231231

232-
function keyofNarrowing<T>(k: keyof T) {
233-
function assertKeyofT(k1: keyof T) { }
232+
function keyofNarrowing<S extends { [K in keyof S]: string }>(k: keyof S) {
233+
function assertKeyofT(k1: keyof S) { }
234234
switch (typeof k) {
235235
case 'number': assertNumber(k); assertKeyofT(k); return;
236236
case 'symbol': assertSymbol(k); assertKeyofT(k); return;
237237
case 'string': assertString(k); assertKeyofT(k); return;
238-
case 'boolean': assertNever(k);
239-
case 'function': assertNever(k);
240-
case 'object': assertNever(k);
241-
case 'undefined': assertNever(k); return;
242238
}
243239
}

0 commit comments

Comments
 (0)