Skip to content

Commit 5059ece

Browse files
authoredFeb 15, 2025··
fix(typescript): Improve type inferring for undefined and null (#10038)
I remember doing that by design, but I forget why. Now let's align it with tsc
1 parent 2622e4e commit 5059ece

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed
 

‎.changeset/nasty-days-help.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_core: patch
3+
swc_typescript: patch
4+
---
5+
6+
fix(typescript): Improve type inferring for undefined and null

‎crates/swc_typescript/src/fast_dts/inferrer.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ use super::{
1414
impl FastDts {
1515
pub(crate) fn infer_type_from_expr(&mut self, e: &Expr) -> Option<Box<TsType>> {
1616
match e {
17+
Expr::Ident(ident) if ident.sym.as_str() == "undefined" => {
18+
Some(ts_keyword_type(TsKeywordTypeKind::TsUndefinedKeyword))
19+
}
1720
Expr::Lit(lit) => match lit {
1821
Lit::Str(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsStringKeyword)),
1922
Lit::Bool(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsBooleanKeyword)),
2023
Lit::Num(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNumberKeyword)),
2124
Lit::BigInt(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsBigIntKeyword)),
22-
Lit::Null(_) | Lit::Regex(_) | Lit::JSXText(_) => None,
25+
Lit::Null(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNullKeyword)),
26+
Lit::Regex(_) | Lit::JSXText(_) => None,
2327
},
2428
Expr::Tpl(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsStringKeyword)),
2529
Expr::Fn(fn_expr) => self.transform_fn_to_ts_type(

‎crates/swc_typescript/src/fast_dts/types.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ impl FastDts {
2020
pub(crate) fn transform_expr_to_ts_type(&mut self, expr: &Expr) -> Option<Box<TsType>> {
2121
match expr {
2222
Expr::Ident(ident) if ident.sym == "undefined" => {
23-
Some(ts_keyword_type(TsKeywordTypeKind::TsAnyKeyword))
23+
Some(ts_keyword_type(TsKeywordTypeKind::TsUndefinedKeyword))
2424
}
2525
Expr::Lit(lit) => match lit {
2626
Lit::Str(string) => Some(ts_lit_type(TsLit::Str(string.clone()))),
2727
Lit::Bool(b) => Some(ts_lit_type(TsLit::Bool(*b))),
28-
Lit::Null(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsAnyKeyword)),
28+
Lit::Null(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNullKeyword)),
2929
Lit::Num(number) => Some(ts_lit_type(TsLit::Number(number.clone()))),
3030
Lit::BigInt(big_int) => Some(ts_lit_type(TsLit::BigInt(big_int.clone()))),
3131
Lit::Regex(_) | Lit::JSXText(_) => None,
@@ -274,7 +274,7 @@ impl FastDts {
274274
elements.push(TsTupleElement {
275275
span: DUMMY_SP,
276276
label: None,
277-
ty: ts_keyword_type(TsKeywordTypeKind::TsAnyKeyword),
277+
ty: ts_keyword_type(TsKeywordTypeKind::TsUndefinedKeyword),
278278
});
279279
continue;
280280
};

‎crates/swc_typescript/tests/deno_test.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ fn dts_as_const() {
267267
);
268268
transform_dts_test(
269269
r#"export const foo = [1, ,2] as const;"#,
270-
"export declare const foo: readonly [1, any, 2];",
270+
"export declare const foo: readonly [1, undefined, 2];",
271271
);
272272

273273
transform_dts_test(
@@ -277,7 +277,7 @@ fn dts_as_const() {
277277
readonly bool: true;
278278
readonly bool2: false;
279279
readonly num: 42;
280-
readonly nullish: any;
280+
readonly nullish: null;
281281
};"#,
282282
);
283283

@@ -331,11 +331,11 @@ fn dts_literal_inference() {
331331
);
332332
transform_dts_test(
333333
r#"export const foo = null;"#,
334-
"export declare const foo: any;",
334+
"export declare const foo: null;",
335335
);
336336
transform_dts_test(
337337
r#"export let foo = undefined;"#,
338-
"export declare let foo: any;",
338+
"export declare let foo: undefined;",
339339
);
340340
transform_dts_test(
341341
r#"export let foo = 10n;"#,

‎crates/swc_typescript/tests/oxc_fixture/as-const.snap

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ declare const F: {
66
readonly number: 1.23;
77
readonly bigint: -123n;
88
readonly boolean: true;
9-
readonly null: any;
10-
readonly undefined: any;
9+
readonly null: null;
10+
readonly undefined: undefined;
1111
readonly function: (a: string) => void;
1212
readonly arrow: (a: string) => void;
1313
readonly object: {
1414
readonly a: "a";
1515
readonly b: "b";
1616
};
17-
readonly array: readonly ["a", any, {
17+
readonly array: readonly ["a", undefined, {
1818
readonly b: "\n";
1919
}];
2020
};

0 commit comments

Comments
 (0)
Please sign in to comment.