Как объявить тип среза объекта определенного типа? - PullRequest
0 голосов
/ 09 июля 2020

Предположим, что есть сложный вложенный объект (например, состояние Redux), и он имеет определенный тип, его свойства верхнего уровня также имеют определенные, но очевидно разные типы. Теперь я хотел бы исправить это только срезом всего состояния, и я хочу, чтобы этот срез был напечатан. Я попробовал Partial<State>, и это, похоже, сработало ... но - частично ... Я получаю подсказки о том, что такое реквизиты и их типы, однако теперь программа проверки машинописного текста требует, чтобы я предоставлял полные объекты для свойств состояния. Как я могу объявить их частичными?

Я пробовал: const slice: Record<keyof State, Partial<State[keyof State]>>, но это не сработало.

interface ListState {
  id: number;
  name: string;
  date: Date;
}

interface NavigationState {
  state: 'one' | 'two' | 'three';
  shouldNavigate: boolean;
}

interface State {
  list: ListState;
  navigation: NavigationState;
}

const slice = { // <-- how to type this?
  list: {
    id: 2,
    date: new Date()
    // notice that name prop is missing
  }
}

const slice2 = { // ... or this?
  navigation: {
    state: 'one'
  }
}

1 Ответ

0 голосов
/ 09 июля 2020

Если ваш фрагмент - stati c, т.е. вы знаете, какие свойства он содержит во время компиляции, вы можете использовать утилиту Pick TypeScript:

// Example definition
interface State {
  list: ListState;
  navigation: NavigationState;
}

// If it only has one state property
const slice: Pick<State, 'list'> = {
  list: {} // Your list state
};

// If it has multiple state properties
const slice: Pick<State, 'list' | 'navigation'> = {
  list: {}, // Your list state,
  navigation: {} // Your navigation state
};

Если вы знаете, что он содержит только некоторые из свойств State, и вы не знаете, какие из них, вы можете просто использовать Partial:

const slice: Partial<State> = {
  list: {} // Your list state
}

В любом случае вы должны иметь возможность:

// If oldState is of type State
const newState: State = { ...oldState, ...slice };
...