Typescript: определить типы без поля - PullRequest
0 голосов
/ 22 января 2019

Я имею дело с устаревшим набором данных и пытаюсь смоделировать некоторые значимые типы в машинописи. Предположим, что в этом примере у меня есть данные об опыте работы из учебной программы для сотрудников:

EMPLOY            | START    | END
'my first employ' | 20180901 | 20181001
'my last employ'  | 20180901 | null

Если END равно null, это означает, что это фактическое использование. Поскольку у меня есть несколько бизнес-правил, касающихся этой концепции домена, я бы хотел смоделировать ее с типами. Вот мой код:

interface ActualExperience {
  actual: true,
  employ: string,
  start: Date,
  end: undefined // <-- no end! 
}

interface PreviousExperience {
  actual: false,
  employ: string,
  start: Date,
  end: Date     // <-- end has a value!
}

type Experience = ActualExperience | PreviousExperience

Пока все хорошо. Тогда я хочу использовать свои типы:

// this is OK
const previous: PreviousExperience = {
  actual: false,
  employ: 'my first employ',
  start: new Date(),
  end: new Date()
}

// ERROR! 
const actual: ActualExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date()
}

Typescript требует от меня явного определения end: undefined для сопоставления с ActualEmploy:

// this is OK now!
const actual: ActualExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date(),
  end: undefined
}

Это очень непрактично для меня, так как я должен явно добавить неопределенное значение в запись только для того, чтобы сделать мой компилятор счастливым.

Как мне спроектировать такую ​​модель?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Есть два способа сделать это.

Во-первых, если нет особой необходимости явно указывать end: undefined в вашем ActualExperience, вы можете просто отбросить его.

Во-вторых, в зависимости от того, что вы пытаетесь сделать, может иметь смысл использовать дополнительный интерфейс:

interface BaseExperience {
  actual: boolean,
  employ: string,
  start: Date,
  end?: Date
}

Затем вы можете указать, что ваши текущие интерфейсы реализуют BaseExperience

interface ActualExperience extends BaseExperience {
  actual: true,
  employ: string,
  start: Date
}

interface PreviousExperience extends BaseExperience {
  actual: false,
  employ: string,
  start: Date,
  end: Date
}

Наконец, вы можете использовать BaseExperience напрямую

const someExperience: BaseExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date()
}

и использовать ActualExperience так, как вы хотите

const actual: ActualExperience = {
  actual: true,
  employ: 'my last employ',
  start: new Date()
}
0 голосов
/ 22 января 2019

объявите ваш интерфейс как:

interface ActualExperience {
  actual: true,
  employ: string,
  start: Date
}

, если в последующем коде вызовите actual.end, javascript вернет undefined, нет необходимости определять его таким образом в вашем интерфейсе "ActualExperience"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...