diff --git a/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs b/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs index 02141109d8..38ac67de83 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs @@ -2091,32 +2091,7 @@ impl Analyzer<'_, '_> { ty => { if let Err(err) = self.assign_with_opts( &mut Default::default(), - &Type::Union(Union { - span, - types: vec![ - 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(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - ], - metadata: Default::default(), - tracker: Default::default(), - }) - .freezed(), + &Type::get_any_key_type(span), ty, AssignOpts { span: ls, 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 b1892bac52..e74754749f 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs @@ -6,7 +6,7 @@ use stc_ts_errors::{debug::force_dump_type_as_string, DebugExt, ErrorKind}; use stc_ts_type_ops::{is_str_lit_or_union, Fix}; use stc_ts_types::{ Class, ClassMember, ClassProperty, Index, KeywordType, KeywordTypeMetadata, LitType, Method, MethodSignature, PropertySignature, - Readonly, Ref, Type, TypeElement, Union, + Readonly, Ref, Type, TypeElement, }; use stc_utils::{cache::Freeze, ext::TypeVecExt, stack, try_cache}; use swc_atoms::js_word; @@ -90,32 +90,7 @@ impl Analyzer<'_, '_> { .context("tried applying `keyof` to a literal by delegating to keyword type handler") } Type::Keyword(KeywordType { kind, .. }) => match kind { - TsKeywordTypeKind::TsAnyKeyword => { - let string = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsStringKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - let number = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsNumberKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - let symbol = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - return Ok(Type::Union(Union { - span, - types: vec![string, number, symbol], - metadata: Default::default(), - tracker: Default::default(), - })); - } + TsKeywordTypeKind::TsAnyKeyword | TsKeywordTypeKind::TsNeverKeyword => return Ok(Type::get_any_key_type(span)), TsKeywordTypeKind::TsVoidKeyword | TsKeywordTypeKind::TsUndefinedKeyword | TsKeywordTypeKind::TsNullKeyword @@ -157,33 +132,6 @@ impl Analyzer<'_, '_> { TsKeywordTypeKind::TsBigIntKeyword => {} TsKeywordTypeKind::TsSymbolKeyword => {} - TsKeywordTypeKind::TsNeverKeyword => { - return Ok(Type::Union(Union { - span, - types: vec![ - 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(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - ], - metadata: Default::default(), - tracker: Default::default(), - })) - } TsKeywordTypeKind::TsIntrinsicKeyword => {} }, diff --git a/crates/stc_ts_types/src/lib.rs b/crates/stc_ts_types/src/lib.rs index 9a4f8bf369..dd622bf37e 100644 --- a/crates/stc_ts_types/src/lib.rs +++ b/crates/stc_ts_types/src/lib.rs @@ -1900,6 +1900,35 @@ impl Type { _ => None, } } + + pub fn get_any_key_type(span: Span) -> Type { + let string = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsStringKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + let number = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsNumberKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + let symbol = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsSymbolKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + + Type::Union(Union { + span, + types: vec![string, number, symbol], + metadata: Default::default(), + tracker: Default::default(), + }) + .freezed() + } } impl Type {