Как проверить, что тип Foo содержит только подмножество свойств из типа Bar? - PullRequest
1 голос
/ 04 октября 2019

У меня есть один интерфейс, AppState, и я хочу иметь возможность кодировать против подмножества этого основного интерфейса appstate, чтобы я извлекал только те свойства, которые были бы заполнены классом контроллера где-то еще выше в конвейере. В конце концов я хочу иметь возможность «подключаться» с помощью FooAppStateSubset, чтобы при разработке мы могли легко выбрать ПРОСТО релевантные и установленные для нашего раздела веб-сайта реквизиты.

Как я могу убедиться, что ...

  1. FooAppStateSubset ONLY содержит свойства и значения, которые также можно найти в интерфейсе AppState
  2. FooAppStateSubset не требуется для вывода списка необязательных параметров из AppState
  3. Сбой во время компиляции и сборки, если нарушены первые два правила
  4. Автозаполнение для свойств будет отличным бонусом,Хорошо, если это невозможно.
  5. Было бы неплохо иметь возможность определять модели по всему веб-сайту без необходимости, чтобы основной интерфейс AppState реализовывал все модели разбросанных подмножеств.

МОДЕЛИ:

interface AppState {
  email: string;
  userId: number;
  firstName?: string;
  isAwesome: boolean;
}


interface/type FooAppStateSubset {
  isAwesome: boolean;
  firstName?: string;
}

1 Ответ

1 голос
/ 04 октября 2019

Самый простой способ, если у вас есть только пара свойств:

type FooAppStateSubset = Omit<Omit<AppState, 'email'>, 'userId'>

В противном случае, возможно, типограф?

function isSubset(something: AppState | FooAppStateSubset): something is FooAppStateSubset {
  return !('email' in something || 'userId' in something);
}

const foo = { isAwesome: true };
isSubset(foo) && console.log(foo.email); // error!
...