diff --git a/lib/core.js b/lib/core.js index 597ee86f090..adb6062f119 100644 --- a/lib/core.js +++ b/lib/core.js @@ -2618,7 +2618,7 @@ declare var console: { type $EnumProto = {| cast(this: TEnumObject, input: ?TRepresentation): void | TEnum, getName(this: TEnumObject, input: TEnum): string, - isValid(this: TEnumObject, input: ?TRepresentation): boolean, + isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, members(this: TEnumObject): Iterator, __proto__: null, |} diff --git a/tests/autocomplete/autocomplete.exp b/tests/autocomplete/autocomplete.exp index 9a92af274d7..658e4239ebf 100644 --- a/tests/autocomplete/autocomplete.exp +++ b/tests/autocomplete/autocomplete.exp @@ -2605,9 +2605,9 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?string) => boolean"}, + "labelDetails":{"detail":": (input: ?(string | E)) => input is E"}, "kind":3, - "detail":"(input: ?string) => boolean", + "detail":"(input: ?(string | E)) => input is E", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ diff --git a/tests/autocomplete_jsdoc/autocomplete_jsdoc.exp b/tests/autocomplete_jsdoc/autocomplete_jsdoc.exp index 9cb53d873ef..b690a255eeb 100644 --- a/tests/autocomplete_jsdoc/autocomplete_jsdoc.exp +++ b/tests/autocomplete_jsdoc/autocomplete_jsdoc.exp @@ -2493,9 +2493,11 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?string) => boolean"}, + "labelDetails":{ + "detail":": (input: ?(string | DefaultedStringEnum)) => input is DefaultedStringEnum" + }, "kind":3, - "detail":"(input: ?string) => boolean", + "detail":"(input: ?(string | DefaultedStringEnum)) => input is DefaultedStringEnum", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ @@ -2672,9 +2674,11 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?string) => boolean"}, + "labelDetails":{ + "detail":": (input: ?(string | InitializedStringEnum)) => input is InitializedStringEnum" + }, "kind":3, - "detail":"(input: ?string) => boolean", + "detail":"(input: ?(string | InitializedStringEnum)) => input is InitializedStringEnum", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ @@ -2851,9 +2855,9 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?number) => boolean"}, + "labelDetails":{"detail":": (input: ?(number | NumberEnum)) => input is NumberEnum"}, "kind":3, - "detail":"(input: ?number) => boolean", + "detail":"(input: ?(number | NumberEnum)) => input is NumberEnum", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ @@ -3030,9 +3034,9 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?boolean) => boolean"}, + "labelDetails":{"detail":": (input: ?(boolean | BooleanEnum)) => input is BooleanEnum"}, "kind":3, - "detail":"(input: ?boolean) => boolean", + "detail":"(input: ?(boolean | BooleanEnum)) => input is BooleanEnum", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ @@ -3209,9 +3213,9 @@ Flags: --lsp } { "label":"isValid", - "labelDetails":{"detail":": (input: ?symbol) => boolean"}, + "labelDetails":{"detail":": (input: ?(symbol | SymbolEnum)) => input is SymbolEnum"}, "kind":3, - "detail":"(input: ?symbol) => boolean", + "detail":"(input: ?(symbol | SymbolEnum)) => input is SymbolEnum", "sortText":"00000000000000000001", "insertTextFormat":1, "textEdit":{ diff --git a/tests/enums/enums.exp b/tests/enums/enums.exp index f8755844ca4..3e6a185bc35 100644 --- a/tests/enums/enums.exp +++ b/tests/enums/enums.exp @@ -1418,8 +1418,8 @@ References: 3| enum E { ^ [2] /core.js:2621:3 - 2621| isValid(this: TEnumObject, input: ?TRepresentation): boolean, - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [3] + 2621| isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [3] Error ----------------------------------------------------------------------------------------- exhaustive-check.js:80:8 @@ -2070,12 +2070,12 @@ References: ^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:29:3 +Error -------------------------------------------------------------------------------------------------- methods.js:35:3 Cannot get `E.nonExistent` because property `nonExistent` is missing in `$EnumProto` [1]. [prop-missing] - methods.js:29:3 - 29| E.nonExistent; // Error + methods.js:35:3 + 35| E.nonExistent; // Error ^^^^^^^^^^^ References: @@ -2084,19 +2084,19 @@ References: 2618| type $EnumProto = {| 2619| cast(this: TEnumObject, input: ?TRepresentation): void | TEnum, 2620| getName(this: TEnumObject, input: TEnum): string, - 2621| isValid(this: TEnumObject, input: ?TRepresentation): boolean, + 2621| isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, 2622| members(this: TEnumObject): Iterator, 2623| __proto__: null, 2624| |} -^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:32:3 +Error -------------------------------------------------------------------------------------------------- methods.js:38:3 Cannot call `E.nonExistent` because property `nonExistent` is missing in `$EnumProto` [1]. [prop-missing] - methods.js:32:3 - 32| E.nonExistent(); // Error + methods.js:38:3 + 38| E.nonExistent(); // Error ^^^^^^^^^^^ References: @@ -2105,19 +2105,19 @@ References: 2618| type $EnumProto = {| 2619| cast(this: TEnumObject, input: ?TRepresentation): void | TEnum, 2620| getName(this: TEnumObject, input: TEnum): string, - 2621| isValid(this: TEnumObject, input: ?TRepresentation): boolean, + 2621| isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, 2622| members(this: TEnumObject): Iterator, 2623| __proto__: null, 2624| |} -^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:35:3 +Error -------------------------------------------------------------------------------------------------- methods.js:41:3 An index signature declaring the expected key / value type is missing in enum `E` [1]. [incompatible-use] - methods.js:35:3 - 35| E['members'](); // Error + methods.js:41:3 + 41| E['members'](); // Error ^^^^^^^^^ References: @@ -2126,12 +2126,12 @@ References: ^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:38:3 +Error -------------------------------------------------------------------------------------------------- methods.js:44:3 Cannot call `E.A` because property `A` is missing in `$EnumProto` [1]. [prop-missing] - methods.js:38:3 - 38| E.A(); // Error + methods.js:44:3 + 44| E.A(); // Error ^ References: @@ -2140,19 +2140,19 @@ References: 2618| type $EnumProto = {| 2619| cast(this: TEnumObject, input: ?TRepresentation): void | TEnum, 2620| getName(this: TEnumObject, input: TEnum): string, - 2621| isValid(this: TEnumObject, input: ?TRepresentation): boolean, + 2621| isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, 2622| members(this: TEnumObject): Iterator, 2623| __proto__: null, 2624| |} -^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:41:3 +Error -------------------------------------------------------------------------------------------------- methods.js:47:3 Cannot call `E.toString` because property `toString` is missing in `$EnumProto` [1]. [prop-missing] - methods.js:41:3 - 41| E.toString(); // Error + methods.js:47:3 + 47| E.toString(); // Error ^^^^^^^^ References: @@ -2161,44 +2161,44 @@ References: 2618| type $EnumProto = {| 2619| cast(this: TEnumObject, input: ?TRepresentation): void | TEnum, 2620| getName(this: TEnumObject, input: TEnum): string, - 2621| isValid(this: TEnumObject, input: ?TRepresentation): boolean, + 2621| isValid(this: TEnumObject, input: ?TRepresentation | TEnum): input is TEnum, 2622| members(this: TEnumObject): Iterator, 2623| __proto__: null, 2624| |} -^ [1] -Error -------------------------------------------------------------------------------------------------- methods.js:44:1 +Error -------------------------------------------------------------------------------------------------- methods.js:50:1 Cannot cast `E.getName(...)` to boolean because string [1] is incompatible with boolean [2]. [incompatible-cast] - methods.js:44:1 - 44| E.getName(E.B) as boolean; // Error - wrong type + methods.js:50:1 + 50| E.getName(E.B) as boolean; // Error - wrong type ^^^^^^^^^^^^^^ References: /core.js:2620:45 2620| getName(this: TEnumObject, input: TEnum): string, ^^^^^^ [1] - methods.js:44:19 - 44| E.getName(E.B) as boolean; // Error - wrong type + methods.js:50:19 + 50| E.getName(E.B) as boolean; // Error - wrong type ^^^^^^^ [2] -Error -------------------------------------------------------------------------------------------------- methods.js:50:1 +Error -------------------------------------------------------------------------------------------------- methods.js:56:1 Cannot call `o.cast` because object literal [1] is incompatible with enum `E` [2]. [incompatible-call] - methods.js:50:1 - 50| o.cast('x'); // Error + methods.js:56:1 + 56| o.cast('x'); // Error ^ References: - methods.js:47:11 + methods.js:53:11 v - 47| const o = { - 48| cast: E.cast, - 49| }; + 53| const o = { + 54| cast: E.cast, + 55| }; ^ [1] methods.js:3:6 3| enum E { diff --git a/tests/enums/methods.js b/tests/enums/methods.js index 4901763b91a..de2b038cf7c 100644 --- a/tests/enums/methods.js +++ b/tests/enums/methods.js @@ -15,6 +15,12 @@ const b: Iterable = E.members(); const c: boolean = E.isValid('A'); E.isValid(maybeString); const s: string = E.getName(E.A); +{ + const x = 'A'; + if (E.isValid(x)) { + x as E; // OK + } +} // .members() for (const x of E.members()) {