Я пробую описанный здесь метод номинальной типизации на основе перечисления: https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html
enum PersonIdBrand {}
export type PersonId = PersonIdBrand & string
interface Person {
id: PersonId
firstName: string
lastName: string
}
Я столкнулся с проблемой добавления типов в некоторые фабричные методы, используемые тестами.Эти вспомогательные методы позволяют создавать тестовые данные со значениями по умолчанию, которые можно выборочно переопределять:
const makeTestPerson = ({
id = 'personId' as PersonId,
firstName = 'Bob',
lastName = 'Smith'
}: Partial<Person> = {}): Person => ({
id,
firstName,
lastName
})
const person = makeTestPerson({ lastName: 'Ross' })
Однако tsc
выдает ошибку:
error TS2322: Type 'PersonId' is not assignable to type 'never'.
11 id = 'personId' as PersonId,
Если я вместо этого использую id: string
вместо этого он компилируется без проблем.Можно ли как-нибудь проверить эти функции с помощью PersonId
?
Обновление , изучив немного больше, думаю, есть более фундаментальная проблема с этой стратегией:
const maybePersonId: PersonId | undefined = ("personId" as PersonId)
Это также не с:
TS2322: Type 'PersonId' is not assignable to type 'undefined'.
Так почему же это не удается?Конечно, X
всегда должен быть назначен на X | undefined
?