是否可以编写实用程序类型来确定类型是否为文本类型? 例如:

type IsLiteral<T> ...

type IsStringALiteral = IsLiteral<string> // false
type IsStringLiteralALiteral = IsLiteral<'abc'> // true
type IsStringALiteral = IsLiteral<bool> // false
type IsStringLiteralALiteral = IsLiteral<false> // true

推荐答案

在这里回答我自己的问题,因为我已经弄明白了:

type IsUnion<T, U extends T = T> = T extends unknown ? ([U] extends [T] ? false : true) : false;
type IsStringLiteral<A> = IsUnion<A> extends true ? false : A extends string ? (string extends A ? false : true) : false;
type IsNumberLiteral<A> = IsUnion<A> extends true ? false : A extends number ? (number extends A ? false : true) : false;
type IsBooleanLiteral<A> = IsUnion<A> extends true ? false : A extends boolean ? (boolean extends A ? false : true) : false;
type IsLiteral<A> = IsStringLiteral<A> extends true ? true : IsNumberLiteral<A> extends true ? true : IsBooleanLiteral<A> extends true ? true : false;

请注意,我在这里包含了IsUnion功能,因为在我的例子中,我希望:

type IsStringUnionALiteral = IsLiteral<'a' | 'b'> // false

如果这不符合您的要求,则如下所示:

type IsStringLiteral<A> = A extends string ? (string extends A ? false : true) : false;
type IsNumberLiteral<A> = A extends number ? (number extends A ? false : true) : false;
type IsBooleanLiteral<A> = A extends boolean ? (boolean extends A ? false : true) : false;
type IsLiteral<A> = IsStringLiteral<A> extends true ? true : IsNumberLiteral<A> extends true ? true : IsBooleanLiteral<A> extends true ? true : false;

Typescript相关问答推荐

根据另一个成员推断类成员的类型

缩小并集子键后重新构造类型

表单嵌套太深

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

如何按属性或数字数组汇总对象数组

Typescript 中相同类型的不同结果

与toast.error一起react 中的Async TUNK错误消息

在正常函数内部调用异步函数

如何正确地将元组表格输入到对象数组实用函数(如ZIP)中,避免在TypeScrip 5.2.2中合并所有值

获取类属性的类型';TypeScript中的getter/setter

Typescript 是否可以区分泛型参数 void?

如何使用 Angular 确定给定值是否与应用程序中特定单选按钮的值匹配?

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

我可以在 Typescript 中重用函数声明吗?

Select 器数组到映射器的Typescript 泛型

如何为对象创建类型,其中键是只读且动态的,但值是固定类型?

如何将参数传递给条件函数类型

从函数参数推断函数返回类型

显式推断元组类型