diff --git a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs index dd37d5205c..c8d610e165 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs @@ -380,7 +380,46 @@ impl Analyzer<'_, '_> { return Ok(ty.clone()); } } - + Type::EnumVariant(e) => { + if matches!(e.name, None) && (e.def.has_num || e.def.has_str) { + return self.keyof( + span, + &if e.def.has_num && e.def.has_str { + Type::new_intersection( + span, + [ + Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsStringKeyword, + metadata: Default::default(), + tracker: Default::default(), + }), + Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsNumberKeyword, + metadata: Default::default(), + tracker: Default::default(), + }), + ], + ) + } else if e.def.has_num { + Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsNumberKeyword, + metadata: Default::default(), + tracker: Default::default(), + }) + } else { + Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsStringKeyword, + metadata: Default::default(), + tracker: Default::default(), + }) + }, + ); + } + } _ => {} } diff --git a/crates/stc_ts_file_analyzer/tests/pass-only/types/keyof/1.ts b/crates/stc_ts_file_analyzer/tests/pass-only/types/keyof/1.ts new file mode 100644 index 0000000000..24bb24b6a4 --- /dev/null +++ b/crates/stc_ts_file_analyzer/tests/pass-only/types/keyof/1.ts @@ -0,0 +1,6 @@ +// @strictNullChecks: true +// @declaration: true + +enum E { A, B, C }; + +type K15 = keyof E; // "toString" | "toFixed" | "toExponential" | ... diff --git a/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.error-diff.json b/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.error-diff.json index 0b24f28a5f..ff6a3adda9 100644 --- a/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.error-diff.json +++ b/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.error-diff.json @@ -2,16 +2,12 @@ "required_errors": {}, "required_error_lines": {}, "extra_errors": { - "TS0": 2, "TS2345": 8, "TS2339": 2, - "TS2322": 12 + "TS2322": 12, + "TS0": 1 }, "extra_error_lines": { - "TS0": [ - 44, - 523 - ], "TS2345": [ 96, 132, @@ -39,6 +35,9 @@ 640, 645, 658 + ], + "TS0": [ + 523 ] } } \ No newline at end of file diff --git a/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.stats.rust-debug b/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.stats.rust-debug index d04e6d347e..c1d16af4c5 100644 --- a/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.stats.rust-debug +++ b/crates/stc_ts_type_checker/tests/conformance/types/keyof/keyofAndIndexedAccess.stats.rust-debug @@ -1,6 +1,6 @@ Stats { required_error: 0, matched_error: 5, - extra_error: 24, + extra_error: 23, panic: 0, } \ No newline at end of file diff --git a/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug b/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug index c1f1543a3a..9956d0d163 100644 --- a/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug +++ b/crates/stc_ts_type_checker/tests/tsc-stats.rust-debug @@ -1,6 +1,6 @@ Stats { required_error: 3502, matched_error: 6533, - extra_error: 768, + extra_error: 767, panic: 74, } \ No newline at end of file