Поток - создание свойства «один или другой» - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать тип для объекта, который имеет базовые свойства и свойство «одно или другое».Я пытался использовать типы union и пересечения , чтобы достичь этого, но мои знания ограничены, и я не могу понять это.

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

Моя попытка:

type Base = {
    name: string,
    age: number
}

type Teacher = Base & {
    teacherId: number,
}

type Student = Base & {
    studentId: number
}

type Person = Student | Teacher;

const person: Person = {
    name: "John",
    age: 20,
    studentId: 000,
    teacherId: 111
}

console.log(person.age); // Works

console.log(person.studentId); // Fails?
console.log(person.teacherId); // Fails?

Попробуйте

1 Ответ

0 голосов
/ 16 апреля 2019

Объекты в настоящее время неточны по умолчанию в Flow (хотя команда указала, что это поведение может измениться). Это означает, что набрав

const teacher: Teacher = {
  name: 'Alexa',
  age: 41,
  teacherId: 2,
  studentId: 3
}

является полностью допустимым, поскольку имеет три обязательных свойства name, age и teacherId. См. подтип ширины для получения дополнительной информации.

Чтобы заставить Flow предупреждать о дополнительных свойствах, вам нужно использовать точные объекты (обозначенные {| ... |}). Flow теперь будет жаловаться на использование studentId и teacherId.

type Base = {|
    name: string,
    age: number
|}

type Teacher = {|
    ...Base,
    teacherId: number,
|}

type Student = {|
    ...Base,
    studentId: number
|}

type Person = Student | Teacher;

const person: Person = {
    name: "John",
    age: 20,
    studentId: 000,
    teacherId: 111
} // Fails

Try Flow

...