IsLiteral: Return false for tagged types (#886)

This commit is contained in:
CJ Quines 2024-06-07 07:06:00 -04:00 committed by GitHub
parent cabce984e5
commit 587380ce8e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 4 deletions

View File

@ -22,10 +22,12 @@ LiteralCheck<1, string>
*/
type LiteralCheck<T, LiteralType extends Primitive> = (
IsNever<T> extends false // Must be wider than `never`
? [T] extends [LiteralType] // Must be narrower than `LiteralType`
? [LiteralType] extends [T] // Cannot be wider than `LiteralType`
? false
: true
? [T] extends [LiteralType & infer U] // Remove any branding
? [U] extends [LiteralType] // Must be narrower than `LiteralType`
? [LiteralType] extends [U] // Cannot be wider than `LiteralType`
? false
: true
: false
: false
: false
);

View File

@ -5,6 +5,7 @@ import type {
IsNumericLiteral,
IsBooleanLiteral,
IsSymbolLiteral,
Tagged,
} from '../index';
const stringLiteral = '';
@ -65,3 +66,8 @@ type A2 = IsNumericLiteral;
type A3 = IsBooleanLiteral;
// @ts-expect-error
type A4 = IsSymbolLiteral;
// Tagged types should be false
expectType<IsStringLiteral<Tagged<string, 'Tag'>>>(false);
expectType<IsNumericLiteral<Tagged<number, 'Tag'>>>(false);
expectType<IsBooleanLiteral<Tagged<boolean, 'Tag'>>>(false);