From 1cc16a6425750a556461b44412c34b346636313e Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Wed, 9 Aug 2023 07:20:35 -0700 Subject: [PATCH 1/2] Feat: implement keyof about Enum --- .../src/analyzer/types/keyof.rs | 43 ++++++++++++++++++- .../tests/pass-only/types/keyof/1.ts | 6 +++ .../keyofAndIndexedAccess.error-diff.json | 11 +++-- .../keyofAndIndexedAccess.stats.rust-debug | 2 +- .../tests/tsc-stats.rust-debug | 2 +- 5 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 crates/stc_ts_file_analyzer/tests/pass-only/types/keyof/1.ts 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..a464247897 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,48 @@ impl Analyzer<'_, '_> { return Ok(ty.clone()); } } - + Type::EnumVariant(e) => { + if matches!(e.name, None) { + if 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 From 31ce0f5ef8db6b9ee77cc205b94f7fb376a0a3c4 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Wed, 9 Aug 2023 07:26:43 -0700 Subject: [PATCH 2/2] Improve conditional expr --- .../src/analyzer/types/keyof.rs | 76 +++++++++---------- 1 file changed, 37 insertions(+), 39 deletions(-) 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 a464247897..c8d610e165 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs @@ -381,45 +381,43 @@ impl Analyzer<'_, '_> { } } Type::EnumVariant(e) => { - if matches!(e.name, None) { - if 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(), - }) - }, - ); - } + 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(), + }) + }, + ); } } _ => {}