2017-03-15 3 views
0

を継承しますemail(と私は簡単にそれを維持するためには表示されません。他のすべてのフィールド)を複製することなく、意味を次レッツクラスは、私は、ユーザークラスを作成しようとタイプエイリアスを継承することができるようにしたいタイプの別名から

type PlainUser = { email: string } 

class User { 
    email: string 

    constructor (initialValues: PlainUser) { 
    this.email = initialValues.email 
    } 

    update() { ... } 
} 

は流れで可能このですか?

答えて

0

これはわかりませんが、少なくともimplementsを使用して、インターフェイスを実装するようにしてください(はい、インターフェイスにする必要があります)。

interface PlainUser { 
    email: string; 
} 

class Foo implements PlainUser { 
} 

tryflow

上記のコードはFooemailプロパティを指定しないので、フローv0.41と、次のエラーをもたらす:もちろん

7: class Foo implements PlainUser { 
         ^property `email` of PlainUser. Property not found in 
7: class Foo implements PlainUser { 
     ^Foo 

が、これはありませんまさにあなたが求めてきたものです。しかし、少なくともUserPlainUserを実装しているかどうかを自動的にチェックしています。

0

クラスからのみ拡張できます。タイプエイリアスはインターフェイスなので、ここでimplementを使用する必要があります。活字体サルサはthis suggestion was implementedので、以下を実行することができます:

type PlainUser = { email: string }; 

class User implements PlainUser { 
    constructor (initialValues: PlainUser) { 
     this.email = initialValues.email; 
    } 
} 

あなたはサルサを使用しない場合は、明示的に継承されたプロパティを宣言する必要があります。

type PlainUser = { email: string }; 

class User implements PlainUser { 
    public email: string; 
    constructor (initialValues: PlainUser) { 
     this.email = initialValues.email; 
    } 
} 

Playground

+1

質問はFlowtypeについてですので、これは質問に答えるようには見えません。 – loganfsmyth

+0

@loganfsmythうわー、それは気づかなかった。 –

0

私はこれだった認めますよ最初は頭のスクラッチャーですが、あなたがしたいことのようなものは非常に可能です。それは少しアプローチを再考する必要があります。

まず、オブジェクトリテラルの代わりにclassで始める必要があります。直感的に言えば、これは理にかなっています.JavaScriptの仕組みでもあります。

class User { 
    email: string; 
} 

次に、フローの$Shape変換を使用します。これはあなたの型をクラスの列挙可能なプロパティにキャストします。

type PlainUser = $Shape<User>; 

const Bob: PlainUser = { email: "[email protected]" } 

又は

const BobProperties: PlainUser = { ...new PlainUserClass("[email protected]") } 

最後に、通常のようにユーザクラスを拡張します。

class AdminUser extends User { 
    admin: true; 
} 

example

関連する問題