我可以在TypeScript中声明自定义数字类型吗?

Wiz*_*zek 6 typescript

我可以以某种方式声明自定义数字类型吗?例如,我想要一个UnixMsDate和一个UnixSDate类型,我想如果TS可以帮助我总是区分和消除这两者之间的歧义,这意味着我从不会意外混淆它们.虽然能够明确地在它们之间(和/从数字)进行转换.

我试过type UnixMsDate = number并编译,但它似乎只是数字的可互换别名.

我正在寻找什么可能吗?

小智 7

使用枚举

enum UnixMsDate { }
enum UnixSDate { }

let date1: UnixMsDate;
let date2: UnixSDate;

date1 = date2; // Type 'UnixSDate' is not assignable to type 'UnixMsDate'.

function foo(x: UnixMsDate) { }
foo(date2); // Argument of type 'UnixSDate' is not assignable to type 'UnixMsDate'.

// All the below work.
date1 = +new Date();
date1 += 22;
console.log(date1 + date2);
date1 = 3.14159;
x1 = +x2;
x1 = Number(x2);
foo(+x2);
Run Code Online (Sandbox Code Playgroud)

使用交叉类型的替代方法

您可以使用交集类型完成相同的操作:

type A = number & { _A: void; };
type B = number & { _B: void; };
Run Code Online (Sandbox Code Playgroud)

这几乎完全相同,除了你在分配时需要施放:

let a: A = <A>222;
Run Code Online (Sandbox Code Playgroud)

它仍然不能阻止将两种类型的数字加在一起.以下是有关此hack的更多信息.