4

Я хочу превратить исходные данные в рабочие данные. Оба имеют свой собственный тип, единственное отличие состоит в том, что в исходных данных имена являются необязательными. Когда я создаю рабочие данные, я использую значение по умолчанию '__unknown__' для пустых имен.Ошибка при использовании оператора спреда в объектах с дополнительным свойством

Вот пример кода:

/* @flow */ 

type NAME_OPTIONAL = { 
    name?: string 
} 

type NAME_MANDATORY = { 
    name: string 
} 

type INITIAL = { 
    source: string, 
    data: NAME_OPTIONAL[] // <-- Here the names are OPTIONAL. 
} 

type WORKING = { 
    source: string, 
    data: NAME_MANDATORY[] // <-- Here the name are MANDATORY. 
} 

// We have some initial data. 
const initial: INITIAL = { 
    source: 'some.server.com', 
    data: [{ name: 'Adam' }, { name: undefined }] 
} 

// And we want to turn initial data into working data. 
const workingData = initial.data.map((i) => { 
    return { 
    name: i.name || '__unknown__' 
    } 
}); 

// This is OK: 
const working1: WORKING = { 
    source: initial.source, 
    data: workingData 
} 

// This is NOT OK: 
const working2: WORKING = { 
    ...initial, 
    data: workingData 
} 

В конце примера выше инициализации working1 в порядке, но инициализация working2, используя оператор объекта распространения, вызывает flowtype показать эту ошибку:

4: name?: string 
      ^undefined. This type is incompatible with 
8: name: string 
     ^string 

Я не понимаю, как это может сделать оператор распространения. Может кто-нибудь объяснить это? Спасибо.

"Working" example on https://flowtype.org/try/... is here.

ответ

1

Есть a lot of bugs about the spread operator. Ваше дело похоже на this one.

Вероятно, нет решения, пока они не исправить, за исключением замены оператора с Object.assign:

const working2: WORKING = Object.assign({}, initial, { data: workingData }) 

Если все еще не работает, вы можете добавить аннотацию выше линии:

// $FlowIssue 
const working2: WORKING = Object.assign({}, initial, { data: workingData }) 

Или:

// $FlowIssue 
const working2: WORKING = { 
    ...initial, 
    data: workingData 
} 

А затем добавьте эту настройку в .flowconfig

[options] 
suppress_comment=.*\\$FlowIssue 

Это подавляет ошибку.

Смежные вопросы