我有两种永不相交的类型。有没有办法在做类型检查器标志时这样做呢?理想情况下,我只想在类型世界中这样做而无需声明任何冗余变量。
示例:
type A = 1 | 2 // Must be different from B
type B_OK = 3
type B_FAIL = 2 | 3
// What I want (pseudo Typescript)
type AssertDifferent<X,Y> = Extract<X,Y> extends never ? any : fail // Fail if the types intersect
// Expected result (pseudo Typescript)
AssertDifferent<A,B_OK> // TS is happy
AssertDifferent<A,B_FAIL> // Fails type check
答案 0 :(得分:1)
您最好的选择是使条件类型返回true或false,然后尝试将true
分配给结果。像这样:
type A = 1 | 2 // Must be different from B
type B_OK = 3
type B_FAIL = 2 | 3
type AssertTrue<T extends true> = T;
type IsDifferent<X,Y> = Extract<X,Y> extends never ? true : false
type result1 = AssertTrue<IsDifferent<A, B_OK>>; // OK
type result2 = AssertTrue<IsDifferent<A, B_FAIL>>; // Error
您可以在第二行使用版本3.9中的新@ts-expect-error
comments功能来强制执行该错误总是会抛出。