Skip to content

Commit 405b434

Browse files
committed
Use typescript type predicate functions
1 parent 6074cc9 commit 405b434

8 files changed

+37
-28
lines changed

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__bools__shadowed_bools_and_nil_typescript.snap

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
---
22
source: compiler-core/src/javascript/tests/bools.rs
3+
assertion_line: 81
34
expression: "\npub type True { True False Nil }\npub fn go(x, y) {\n let assert True = x\n let assert False = x\n let assert Nil = y\n}\n"
5+
snapshot_kind: text
46
---
57
----- SOURCE CODE
68

@@ -17,15 +19,15 @@ import type * as _ from "../gleam.d.mts";
1719

1820
export class True extends _.CustomType {}
1921
export function True$True(): True$;
20-
export function True$isTrue(value: True$): boolean;
22+
export function True$isTrue(value: any): value is True$;
2123

2224
export class False extends _.CustomType {}
2325
export function True$False(): True$;
24-
export function True$isFalse(value: True$): boolean;
26+
export function True$isFalse(value: any): value is True$;
2527

2628
export class Nil extends _.CustomType {}
2729
export function True$Nil(): True$;
28-
export function True$isNil(value: True$): boolean;
30+
export function True$isNil(value: any): value is True$;
2931

3032
export type True$ = True | False | Nil;
3133

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__const_with_fields_typescript.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class Mine extends _.CustomType {
2626
b: number;
2727
}
2828
export function Mine$Mine(a: number, b: number): Mine$;
29-
export function Mine$isMine(value: Mine$): boolean;
29+
export function Mine$isMine(value: any): value is Mine$;
3030
export function Mine$Mine$0(value: Mine$): number;
3131
export function Mine$Mine$a(value: Mine$): number;
3232
export function Mine$Mine$1(value: Mine$): number;

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__long_name_variant_mixed_labels_typescript.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ export function TypeWithALongNameAndSeveralArguments$TypeWithALongNameAndSeveral
4444
b: string,
4545
): TypeWithALongNameAndSeveralArguments$;
4646
export function TypeWithALongNameAndSeveralArguments$isTypeWithALongNameAndSeveralArguments(
47-
value: TypeWithALongNameAndSeveralArguments$,
48-
): boolean;
47+
value: any,
48+
): value is TypeWithALongNameAndSeveralArguments$;
4949
export function TypeWithALongNameAndSeveralArguments$TypeWithALongNameAndSeveralArguments$0(value: TypeWithALongNameAndSeveralArguments$): string;
5050
export function TypeWithALongNameAndSeveralArguments$TypeWithALongNameAndSeveralArguments$1(
5151
value: TypeWithALongNameAndSeveralArguments$,

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unapplied_record_constructors_typescript.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class Cat extends _.CustomType {
2222
name: string;
2323
}
2424
export function Cat$Cat(name: string): Cat$;
25-
export function Cat$isCat(value: Cat$): boolean;
25+
export function Cat$isCat(value: any): value is Cat$;
2626
export function Cat$Cat$0(value: Cat$): string;
2727
export function Cat$Cat$name(value: Cat$): string;
2828

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__custom_types__unnamed_fields_typescript.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class Ip extends _.CustomType {
2424
0: string;
2525
}
2626
export function Ip$Ip($0: string): Ip$;
27-
export function Ip$isIp(value: Ip$): boolean;
27+
export function Ip$isIp(value: any): value is Ip$;
2828
export function Ip$Ip$0(value: Ip$): string;
2929

3030
export type Ip$ = Ip;

compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__generics__record_generics_typescript.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export class Cat<I> extends _.CustomType {
2525
type_: I;
2626
}
2727
export function Animal$Cat<I>(type_: I): Animal$<I>;
28-
export function Animal$isCat<I>(value: Animal$<I>): boolean;
28+
export function Animal$isCat<I>(value: any): value is Animal$<unknown>;
2929
export function Animal$Cat$0<I>(value: Animal$<I>): I;
3030
export function Animal$Cat$type_<I>(value: Animal$<I>): I;
3131

@@ -36,7 +36,7 @@ export class Dog<I> extends _.CustomType {
3636
type_: I;
3737
}
3838
export function Animal$Dog<I>(type_: I): Animal$<I>;
39-
export function Animal$isDog<I>(value: Animal$<I>): boolean;
39+
export function Animal$isDog<I>(value: any): value is Animal$<unknown>;
4040
export function Animal$Dog$0<I>(value: Animal$<I>): I;
4141
export function Animal$Dog$type_<I>(value: Animal$<I>): I;
4242

compiler-core/src/javascript/typescript.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -510,12 +510,8 @@ impl<'a> TypeScriptGenerator<'a> {
510510
type_name_with_generics,
511511
type_parameters,
512512
);
513-
let variant_check_definition = self.variant_check_definition(
514-
constructor,
515-
type_name,
516-
type_name_with_generics,
517-
type_parameters,
518-
);
513+
let variant_check_definition =
514+
self.variant_check_definition(constructor, type_name, type_parameters);
519515
let fields_definition = self.variant_fields_definition(
520516
constructor,
521517
type_name,
@@ -657,24 +653,35 @@ impl<'a> TypeScriptGenerator<'a> {
657653
&self,
658654
constructor: &'a TypedRecordConstructor,
659655
type_name: &'a str,
660-
type_name_with_generics: &Document<'a>,
661656
type_parameters: &'a [Arc<Type>],
662657
) -> Document<'a> {
663658
let function_name = eco_format!(
664659
"{type_name}$is{variant_name}",
665660
variant_name = constructor.name
666661
)
667662
.to_doc();
668-
669-
docvec![
663+
let mut document = docvec![
670664
"export function ",
671665
name_with_generics(function_name, type_parameters),
672666
"(",
673-
docvec![break_("", "",), "value: ", type_name_with_generics.clone(),].nest(INDENT),
667+
docvec![break_("", "",), "value: any"].nest(INDENT),
674668
break_(",", ""),
675-
"): boolean;",
676-
]
677-
.group()
669+
"): value is ",
670+
type_name,
671+
"$",
672+
];
673+
if !type_parameters.is_empty() {
674+
for i in 0..type_parameters.len() {
675+
if i == 0 {
676+
document = document.append("<unknown");
677+
} else {
678+
document = document.append(", unknown");
679+
}
680+
}
681+
document = document.append('>');
682+
};
683+
document = document.append(';');
684+
document.group()
678685
}
679686

680687
fn variant_fields_definition(

compiler-core/templates/prelude.d.mts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ export const List: {
3131
}
3232
export function List$Empty<T>(): List<T>;
3333
export function List$NonEmpty<T>(head: T, tail: List<T>): List<T>;
34-
export function List$isEmpty(list: any): boolean;
35-
export function List$isNonEmpty(list: any): boolean;
34+
export function List$isEmpty(list: any): list is List<unknown>;
35+
export function List$isNonEmpty(list: any): list is List<unknown>;
3636
export function List$NonEmpty$first<T>(list: List<T>): T | undefined;
3737
export function List$NonEmpty$rest<T>(list: List<T>): List<T> | undefined;
3838
/** @deprecated */
@@ -72,7 +72,7 @@ export function BitArray$BitArray(
7272
bitSize: number,
7373
bitOffset: number,
7474
): BitArray;
75-
export function BitArray$isBitArray(value: any): boolean;
75+
export function BitArray$isBitArray(value: any): value is BitArray;
7676
export function BitArray$BitArray$data(value: BitArray): DataView;
7777

7878
export interface UtfCodepoint {
@@ -97,8 +97,8 @@ export const Result: {
9797
}
9898
export function Result$Ok<T, E>(value: T): Result<T, E>;
9999
export function Result$Error<T, E>(error: E): Result<T, E>;
100-
export function Result$isError(data: any): boolean;
101-
export function Result$isOk(data: any): boolean;
100+
export function Result$isError(data: any): data is Result<unknown, unknown>;
101+
export function Result$isOk(data: any): data is Result<unknown, unknown>;
102102
export function Result$Ok$0<T, E>(result: Result<T, E>): T | undefined;
103103
export function Result$Error$0<T, E>(result: Result<T, E>): E | undefined;
104104
/** @deprecated */

0 commit comments

Comments
 (0)