2017-02-13 4 views
1

Скажем, у меня была функция:Объект с частичным определением flowjs

const example = (item : ?{+type?: ?string}) : {+result: ?string} => { 
    const state = {} 
    state.result = item.result 
    return state 
} 

Это не в состоянии typecheck с:

12:   state.result = item.result 
            ^^^^^^^ property `result`. Property not found in 
12:   state.result = item.result 
          ^^^^^^ object type 

Почему это не typecheck? Я не определял тип с точным обозначением типа объекта ?{|+type?: ?string|}, так что не следует ли ему вводить дополнительные ключи? Как работает точная запись объектов? И как я могу определить частичные типы объектов, как это? Возможно ли это?

+0

Ваш аргумент 'item' не имеет свойства, называемого' result'. Вы имели в виду написать 'state.result = item.type' вместо этого? (хотя вам также потребуется нулевая проверка). –

+0

без сожаления, если мой вопрос неясен, не стесняйтесь редактировать. Я имею в виду, что в этом объекте может быть много ключей, не все из которых я могу перечислить, и я не понимаю, почему поток не работает с typecheck, учитывая, что я не использовал нотацию «точного объекта». В любом случае я мог бы прояснить вопрос (не стесняйтесь редактировать, кстати!) –

ответ

1

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

{ [key: KeyType]: ValueType }; 

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

const example = (item : ?{[key: string]: string}) : {+result: ?string} => { 
    const state = {} 
    if(item) 
    { 
    state.result = item.result; 
    } 
    return state 
} 

Примечание, вы должны сделать нулевой чек на item или иначе она не будет typecheck, так как вы объявили его нулевым в сигнатуре функции.

Если есть определенные требуемые свойства item, то вы можете использовать тип пересечения, чтобы добавить это ограничение. Я создам для этого новый тип, поэтому читать его проще:

type Item = {[key: string]: string} & {type: string} 

const example = (item : ?Item) : {+result: ?string} => { 
    const state = {} 
    if(item) 
    { 
    state.result = item.result; 
    } 
    return state 
} 


example({type: 'blah', x: '2'}); // OK 
example({'blah', x: '2'}); // Error: type is missing 
+0

Можно ли обеспечить наличие некоторых ключей в элементе, если оно существует? –

+0

Один вопрос, который я до сих пор не совсем понимаю, ответ на вопрос, каково точное обозначение объекта, полезное, если не это? –

+0

Точная запись объекта - это эта часть: '{type: string}'. Но я также объединил его с типом карты, используя '&', чтобы сказать: он может иметь ** любые свойства строки **, но это ** должно ** иметь свойство 'type'. –

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