Расширение типа объекта и перезапись свойства в потоке

#javascript #typescript #flowtype #flow-typed

#javascript #typescript #тип потока #типизированный потоком

Вопрос:

В TypeScript я могу сделать следующее:

 interface MyObj {
    a: 'foo' | 'bar'
}

interface MyExtObj extends Pick<MyObj, Exclude<keyof MyObj, 'a'>> {
    a: MyObj['a'] | 'baz'
}

const test: MyExtObj = {
    a: 'baz' // Works fine, as well as 'foo' and 'bar'
}
  

Возможно ли это сделать с типами объектов потока, и если да, то как? Следующий пример завершается с ошибкой…

 /* @flow */

type MyObj = {
    a: 'foo' | 'bar'
}

type MyExtObj = MyObj amp; {
    a: $PropertyType<MyObj, 'a'> | 'baz'
}

const test: MyExtObj = {
    a: 'baz' // Cannot assign object literal blah blah ...
}
  

Ответ №1:

Нравится это?

 /* @flow */

type MyObj = {|
    a: 'foo' | 'bar'
|}

type MyExtObj = {|
    ...MyObj,
    a: $PropertyType<MyObj, 'a'> | 'baz'
|}

const test: MyExtObj = {
    a: 'baz' // Cannot assign object literal blah blah ...
}
  

Вы можете протестировать здесь

Ответ №2:

Это также работает, если вы по какой-то причине не хотите делать myObj точным:

 /* @flow */

type MyObj = {
    a: 'foo' | 'bar'
}

type MyExtObj = {|
    ...$Exact<MyObj>,
    a: $PropertyType<MyObj, 'a'> | 'baz'
|}

const test: MyExtObj = {
    a: 'baz' // Cannot assign object literal blah blah ...
}