在这里回答我自己的问题,因为我已经弄明白了:
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;