Это возможно путем определения условного типа, который принимает два типа и разрешается в true
, когда типы ввода равны, или false
в противном случае. Затем напишите некоторый код, который выдаст ошибку компиляции, если этот тип не true
.
Когда один из типов изменится, вы получите ошибку компиляции, которая гарантирует, что вы не забудете обновить тот тип, который не синхронизирован. Это особенно полезно, когда вы хотите получать уведомления об изменениях типа в другой библиотеке.
Например:
type IsExact<T, U> = [T] extends [U] ? [U] extends [T] ? true : false : false;
function assert<T extends true | false>(expectTrue: T) {}
// this will throw a compile error when the two types get out of sync
assert<IsExact<AllKey, KeepKey | IgnoreKey>>(true);
Более надежный код немного длиннее (например, обработка типа any
), но он свернут в моей библиотеке здесь .
import { assert, IsExact } from "conditional-type-checks";
// define or import AllKey, KeepKey, IgnoreKey
assert<IsExact<AllKey, KeepKey | IgnoreKey>>(true);
Другой вариант
Еще один не очень хороший способ сделать это - создать два объекта двух типов и назначить их друг другу.
() => {
let allKeys: AllKey;
let otherKeys: KeepKey | IgnoreKey;
// do this in lambdas to prevent the first assignment from changing
// the type of the variable being assigned to
() => allKeys = otherKeys;
() => otherKeys = allKeys;
};