将字符串 "true" 和 "false" 从联合类型替换为布尔值
Replacing string "true" and "false" from union type to booleans
我有一种由对象键构造的联合类型,它可能包含字符串、数字和布尔键。
示例:
type Example = "true" | "semi" | "false";
我想要实现的是获得一个新类型,它将字符串 true
或 false
替换为实际的布尔值。
type Example = true | "semi" | false;
直接转换为布尔值是行不通的,因为在某些情况下我可能没有 true
或 false
这是我试过的
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>
我也试过将 ReplaceTrue
和 ReplaceFalse
组合成一个类型,但我认为这会导致代码更难读。
但是,我觉得这些解决方案并不优雅,我想知道是否有任何其他方法可以替代它们。
使用映射类型:
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
您可以做更复杂的事情,包括映射查找或嵌套实用程序类型,但上面的定义可能是只有两种情况的最简洁的定义。
我有一种由对象键构造的联合类型,它可能包含字符串、数字和布尔键。
示例:
type Example = "true" | "semi" | "false";
我想要实现的是获得一个新类型,它将字符串 true
或 false
替换为实际的布尔值。
type Example = true | "semi" | false;
直接转换为布尔值是行不通的,因为在某些情况下我可能没有 true
或 false
这是我试过的
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>
我也试过将 ReplaceTrue
和 ReplaceFalse
组合成一个类型,但我认为这会导致代码更难读。
但是,我觉得这些解决方案并不优雅,我想知道是否有任何其他方法可以替代它们。
使用映射类型:
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
您可以做更复杂的事情,包括映射查找或嵌套实用程序类型,但上面的定义可能是只有两种情况的最简洁的定义。