在TypeScript中怎样定义补类型

TypeScript 目前没有这个功能(有一个类似的提案 Subtraction types · Issue #4183 · Microsoft/TypeScript),但是可以通过函数重载来模拟类似的效果:
【在TypeScript中怎样定义补类型】 在TypeScript中怎样定义补类型

例如在上面的例子中,如果传入空字符串获取到的是一个 never type,而对其它字符串返回正常的结果。
不过,如果函数的功能不依赖于返回值的话,那这个方法就没用了。

■网友
泻药,不过不懂ts。在dotty里我倒是能够实现类似这样的东西。。。
Enforce type difference
借助隐式和 implicit function type 完全可以做出不弱于Kotlin中空安全的效果。

■网友
你要是想丢 runtime error 还不如直接 assert(str.length \u0026gt; 0)

■网友
现在版本能判断基于对象的键的补类型虽然不能用在与string和空字符串
export type WithOutKey\u0026lt;A, B extends PropertyKey\u0026gt; = Pick\u0026lt;A, Exclude\u0026lt;keyof A, B\u0026gt;\u0026gt;type x = WithOutKey\u0026lt;{ a: 1, b: 2 }, \u0026gt;这里的x就是{ a : 1 }了
或者2个对象,写起来废话多点
export type Minus\u0026lt;A, B\u0026gt; = Pick\u0026lt;A, Exclude\u0026lt;keyof A, keyof B\u0026gt;\u0026gt;type y = Minus\u0026lt;{ a: 1, b: 2 }, { b: any }\u0026gt;来自于Subtraction types · Issue #4183 · Microsoft/TypeScript这个issue的最下面几句
Playground · TypeScript重点还是在于官方的
/** * Exclude from T those types that are assignable to U */type Exclude\u0026lt;T, U\u0026gt; = T extends U ? never : T;和 keyof 和 数组 返回的是联合类型

如果要用来判断空字符串用这个
type NotEmptyStr\u0026lt;T\u0026gt; = T extends \u0026#39;\u0026#39; ? never : T// type NotEmptyStr\u0026lt;T\u0026gt; = Exclude\u0026lt;T, \u0026#39;\u0026#39;\u0026gt;type a = NotEmptyStr\u0026lt;\u0026#39;\u0026#39;\u0026gt;type b = NotEmptyStr\u0026lt;\u0026#39;asd\u0026#39;\u0026gt;type c = NotEmptyStr\u0026lt;\u0026#39;\u0026#39; | \u0026#39;asd\u0026#39;\u0026gt;a 是 neverb 和 c 是 \u0026#39;asd\u0026#39;
url有引号会出bug,所以用括号括起来
Playground · TypeScript
其实我觉得基于完整对象类型的判断也做的出来试了下,还真做出来了
export type KeyExpand\u0026lt;A\u0026gt; = { : { : A } }export type Expand\u0026lt;A\u0026gt; = KeyExpand\u0026lt;A\u0026gt;export type KeyPack\u0026lt;E\u0026gt; = E extends infer O ? keyof O : anyexport type Minus\u0026lt;A, B\u0026gt; = Pick\u0026lt;A, KeyPack\u0026lt;Exclude\u0026lt;Expand\u0026lt;A\u0026gt;, Expand\u0026lt;B\u0026gt;\u0026gt;\u0026gt;\u0026gt;type a = Minus\u0026lt;{ a: 1, b: 2, c: 3 }, { b: 2 }\u0026gt;// {// a: 1;// c: 3;// }Playground · TypeScript

■网友
啥啥啥?TypeScript有这么牛逼的type system?
我个人直觉的话…… 在TypeScript中怎样定义补类型
会报错,where 在TypeScript中怎样定义补类型


推荐阅读