将字符串 "true" 和 "false" 从联合类型替换为布尔值

Replacing string "true" and "false" from union type to booleans

我有一种由对象键构造的联合类型,它可能包含字符串、数字和布尔键。

示例:

type Example = "true" | "semi" | "false"; 

我想要实现的是获得一个新类型,它将字符串 truefalse 替换为实际的布尔值。

type Example = true | "semi" | false;

直接转换为布尔值是行不通的,因为在某些情况下我可能没有 truefalse

这是我试过的

type ReplaceTrue<T> = Extract<T, "true"> extends never ? T : Exclude<T, "true"> | true;
type ReplaceFalse<T> = Extract<T, "false"> extends never ? T : Exclude<T, "false"> | false;

type PickMyType<T> = ReplaceBoolean<T, "true", true> | ReplaceBoolean<T, "false", false>

我也试过将 ReplaceTrueReplaceFalse 组合成一个类型,但我认为这会导致代码更难读。

但是,我觉得这些解决方案并不优雅,我想知道是否有任何其他方法可以替代它们。

使用映射类型:

type T1 = "true" | "semi" | "false";

type Mapping = { true: true; false: false };
type T2 = Mapping[T1 & keyof Mapping] | Exclude<T1, keyof Mapping>;
// T2 = boolean | "semi"

这可以通过简单的 distributive conditional type:

type ReplBool<T> = T extends "true" ? true : T extends "false" ? false : T;

type Example = "true" | "semi" | "false";
type ReplacedExample = ReplBool<Example>;
// type ReplacedExample = boolean | "semi"
// note that boolean is an alias for true | false

您可以做更复杂的事情,包括映射查找或嵌套实用程序类型,但上面的定义可能是只有两种情况的最简洁的定义。

Playground link to code