web-dev-qa-db-ja.com

FlowType:タイプの継承(タイプAはタイプBのサブセットです...)

Flow 42 のリリース以降、オブジェクトタイプspreadを使用できます。 type TypeB = { ...TypeA }; ????

これはFlowTypeに関する初心者向けの質問だと思いますが、満足できる答えが見つかりませんでした。

私がこのタイプを持っていると仮定しましょう

type A = {
 x: number
}

type B = {
 y: string
}

そして今、私はタイプAとBに基づいた別のタイプを持ちたいと思っています。

type C = {
 ...A,
 ...B,
 z: boolean
}

どのIMHOを次のように解釈する必要がありますか。

type C = {
  x: number,
  y: string,
  z: boolean
}

しかし、これは明らかに機能しません。

これに関するアドバイスやベストプラクティスを教えてください。どうもありがとう。

13
jukben

これは一般的な機能のリクエストであり、実際に進行中です。これが コミット タイプスプレッドの解析を実装します。この機能のタイムラインはわかりませんが、まだ作業が進行中であると思います。

今のところ、交差型を使用できる場合があります(ただし、実際にはこのユースケース用に設計されておらず、混乱を招く問題が発生する可能性があります)。

type C = A & B & {
  z: boolean
}

もちろん、今のところプロパティを複製することもできます。それは少し口に合わないことに同意しますが、それは間違いなく最も簡単なことです。

14
Nat Mote

スプレッドが期待どおりに機能していることを確認しました。交差点がいたるところにありました。これは短い フロータイプの交差がプロップをオプションにできないことを示す遊び場ですが、スプレッドは機能します

後世のためのサンプルコード:

// @flow

export type Affiliation = {
  id: string,
}

export type Address = {
  address1: string,
}


export type BaseContact = {
  id?: string,
  addresses: Array<Address>,
  affiliations?: Array<Affiliation>,
}

type C = BaseContact & {
  addresses: Array<Address>,
}

type CC = {
  ...BaseContact,
  addresses?: Array<Address>,
}

type CCI = BaseContact & {
  addresses?: Array<Address>,
}


class X {}

const c: C = new X() // fails
const cc: CC = new X() // fails
const cci: CCI = new X() // works
3
kross