发布于 2026-01-06 0 阅读
0

高级 TypeScript 练习 - 答案 7

高级 TypeScript 练习 - 答案 7

问题在于该类型的排他性行为。关键在于理解该never类型本身。`T`Never是一个底层类型,也就是说它没有值,就像空集一样。换句话说,我们不能给 `T` 类型赋值never

const x: never = 🕳 // there is no possible value to make compiler happy
Enter fullscreen mode Exit fullscreen mode

我们将使用它never来实现所需的互斥类型行为。

答案 7.1 - 只允许空对象值的类型

type EmptyObject = {
    [K in PropertyKey]: never
}
Enter fullscreen mode Exit fullscreen mode

EmptyObjecttype 是一个映射类型,其中每个键都有一个对应的值类型never。这里的每个键都用表示K in PropertyKeyPropertyKey代表对象的所有可能键。我们可以使用,[K in any]效果相同。因此,对于每个键,我们的类型允许值为never,所以不可能将任何键放入对象中,因为我们没有neverbottom 类型的实例。

答案 7.2 - 将函数类型更改为对其参数互斥

type Exclusive<T1, T2 extends T1> = {
    [K in keyof T2]: K extends keyof T1 ? T2[K] : never 
}
function takeSomeTypeOnly<T extends SomeType>(x: Exclusive<SomeType, T>) { return x }
Enter fullscreen mode Exit fullscreen mode

在解决方案中,我们再次使用了映射类型。我们声明参数是继承自某个类型的东西SomeType,并将其放入Exclusive执行所需转换的类型级函数中。具体来说[K in keyof T2]: K extends keyof T1 ? T2[K] : never,对于每个键,T2我们检查该键是否也在T1(所需类型)中。如果在,则传递该键;否则,never则将其置为无效,这意味着该属性始终无效。

另一种版本Exclusive可以如下所示:

type Exclusive<T1, T2 extends T1> = T2 & Record<Exclude<keyof T2, keyof T1>, never>;
Enter fullscreen mode Exit fullscreen mode

我们使用Record工具类型和Exclude工具类型,使映射类型中所有键都无效,从而T1使其never值类型也无效。将其与连接起来T1会得到相同的结果——不在所需类型中的键具有never值。

完整代码可在Playground找到。

感谢Manolo Edge 的精彩解答和接受挑战。

本系列文章将继续更新。如果您想了解更多关于高级 TypeScript 的精彩问题,请在dev.toTwitter上关注我。

文章来源:https://dev.to/macsikora/advanced-typescript-exercises-answer-7-3k5e