一个基于 TypeScript 类型层的语言,为解决编写复杂类型代码时带来的一系列体验问题。
English | 简体中文
TypeZen:
type Without<T: unknown[], U: number | number[]> = ^{
if (T == [infer First, ...infer Rest]) {
type RC = U == number[] ? U[number] : U; // Right Condition
if (First == RC) {
return Without<Rest, U>
} else {
return [First, ...Without<Rest, U>]
}
}
return T
}
转换后的 TypeScript:
type Without<T extends unknown[], U extends number | number[]> = (
T extends [infer First, ...infer Rest]
? [U extends number[] ? U[number] : U] extends [infer RC]
? First extends RC
? Without<Rest, U>
: [First, ...Without<Rest, U>]
: never
: TZ_URS
) extends infer r_czl5
? r_czl5 extends TZ_URS
? T
: r_czl5
: never;
更多示例请查看 Playground
-
兼容 TypeScript 类型语法
-
通过 TypeScript Plugin 在
*.ts
中引入使用 -
独特的语法糖
-
与常写的
TS/JS
中的语法较为相似(看了秒懂~) -
编写复杂类型代码更加简单、高效、可读
-
-
即写即用(Playground、CLI、VSCode 扩展)
1. 在项目中引入预设类型文件
- 安装
npm i @type-zen/preset-type -D
- 在
tsconfig.json
中引入
{
"compilerOptions": {
"types": ["@type-zen/preset-type"]
}
}
PS: 为什么要使用 @type-zen/preset-type
作为全局类型文件? 因为编译后的 TypeScript 类型可能会用到一些预先定义好的类型(例如: TZ_URS
, ...)
- 根据不同场景采用以下不同的工具来编写
npm i @type-zen/cli -D
tzc -h
Unplugin (待开发)
包含
Webpack
,Vite
,Rollup
, ...
生成 .d.ts
, ...
-
Type Challenges
名称 | 示例 | 支持 |
---|---|---|
literal |
number, string, ...(keyword: [any, boolean, null, never, ...]) |
✅ |
condition |
a == 1 ? 1 : 2 -> a extends 1 ? 1 : 2 a extends 12 ? 13 : 233 |
✅ |
bracket surround |
(123) |
✅ |
tuple |
[1, 2, 3] |
✅ |
array |
number[] string[][] |
✅ |
object |
{ a: 1, b: 2 } , ... |
✅ |
function |
(a: 1, b: 2) => 3 , ... |
✅ |
type-operator |
keyof x , readonly x , ... |
✅ |
infer |
infer x infer xx == xxx1 -> infer xx extends xxx1 infer xx extends xxx |
✅ |
union |
1 | 2 | 3 | [1, 2, 3] |
✅ |
intersection |
1 & 2 & 3 & [11, 22, 33] -> 11 & 22 & 33 |
✅ |
generic args |
<S: string = "S"> -> <S extends string = "S"> <A extends string = "default"> |
✅ |
type reference |
A , Array<1> , IsNumber<"."> |
✅ |
element access |
A["b"] , A[0][Key] |
✅ |
property access |
A.B , A.B.C |
✅ |
template string |
`hello ${name}` ${} 中的表达式仅支持 TypeScript 原生表达式(暂不支持扩展的,如: ^{...} , | [1, 3] , ...) |
✅ |
comment |
// ... /* ... */ |
✅ |
糖块是一种特殊的表达式,可以利用它来编写类型逻辑代码(if, else, for, 局部变量声明等)
糖块的作用域处于 ^{
与 }
中,或是 if
、 for
语句中。
名称 | 示例 | 支持 |
---|---|---|
local |
^{ type B = 1; ... } |
✅ |
only if |
^{ if (a == 1) { do something... } } |
✅ |
if else |
^{ if (a == 1) { do something... } else { do something... } ... } |
✅ |
if else if |
^{ if (a == 1) { do something... } else if (a == 2) { do something... } ... } |
✅ |
multiple condition |
^{ if (a == 1 && b == 2) { do something... } ... } ^{ if (a == 1 || b == 2) { do something... } ... } |
|
for |
^{ for (infer a in UnionValue) { do something... } ... } |
✅ |
return |
^{ ... return 1; } |
✅ |
switch |
^{ switch (a) { case 0, case 1: do something...; case 2, case 3: do something...; } ... } |
⚠️ if 暂不支持!=
逻辑符
⚠️ 糖块中,必须含有return
名称 | 示例 | 支持 |
---|---|---|
type alias |
type A = 1 |
✅ |
interface |
interface A { b: 1 } |
✅ |
enum |
enum A { B = 1, C = "" } const enum A { B = 1, C = "" } |
✅ |
namespace |
namespace A { ... } |
|
declare function |
declare function A(): 1 |
✅ |
declare variable |
declare const A: 1 declare let A: 1 declare var A: 1 |
✅ |
declare module |
declare module '...' { ... } |
|
declare global { ... } |
declare global { ... } |
|
import |
import type {} from '...' ... |
✅ |
export |
export type { ... } ... |
✅ |
...
以及给予过支持的朋友们~💛
当前处于初期阶段(版本为 0.x
),目标是 能用上,以及拥有基本的生态(Playground, Cli, TS Plugin, ...)
但会存在一些不足的地方,这些不足的地方可能会牵扯 TypeScript 深层的实现,又或是当前 @type-zen/core
设计不足的地方、…。这些不足的地方预计在 1.0.0
版本中得以完善。
MIT