2017-01-09 1 views
0

typescriptは構造型の型付けメカニズムを持っています。構造体が同じであれば、Typescriptの読み込み専用型のクラスは通常の型付きのクラスと衝突しません

と、次のように定義された1:あなたはReadonlyCountryタイプのオブジェクトを返す場合

class ReadonlyCountry { 
    readonly id: string; 
    readonly name: string;  
} 

タイピングシステムは、衝突を示すだろうことを、私はあなたがこのようなクラスを持っている場合ということが期待されます戻り値の型がCountryの関数で宣言します。これは、以下に示すtypescript playgroundの例のようなケースではないようです。

class Country { 
 
    id: string; 
 
    name: string; 
 
} 
 

 
class ReadonlyCountry { 
 
    readonly id: string; 
 
    readonly name: string;  
 
} 
 

 
function select(value: string): ReadonlyCountry[] { 
 
    let country = new Country(); 
 
    country.id = "1"; 
 
    country.name = "name"; 
 
    return [country]; 
 
} 
 

 
function select2(value: string): Country[] { 
 
    // the type of the return here will be ReadonlyCountry[] 
 
    // the type of the function return here is Country[] 
 
    // why doesn't this collide? 
 
    return select(value); 
 
}

だから私の質問は、私は型エラーを表示し、読み取り専用のプロパティと読み取り専用の型を持っていないタイプを持っているタイプと、どれが構造的に同じであることを確認することができる方法であり、混合時? ここで何か愚かなことがありませんか?

ご協力いただければ幸いです。

答えて

0

はいこれは、問題の原因となる構造型です。私はあなたのクラスの構造を再考し、異なった扱いが必要な同じ構造のものを避けるべきだと思います。

注釈として。代わりに(そのため、あなたのコードを複製し、メンテナンス頭痛を導入する)同じクラスの読み取り専用バージョンを作成(see here)にマッピングされた型を使用しない理由を、との特別Readonlyすでにあなたのための事前定義1:

function select(value: string): Readonly<Country>[] 

希望これを助けてください。

+0

私はReadonlyマップタイプについて知っており、それを使用しようとしています。 これは私にとっては問題になります。私はReduxを使用しており、私の店から来る状態を読み取り専用にしたいと考えています。これは、直感的なプロパティ(私の店に入る物)と、まるで変わった物(私の店から出てくるもの)を使わずに同じように見えるオブジェクトを持つことを意味します。しかし、私はそれが不可能であることを恐れています.... – KwintenP

+0

私はあなたがReadonlyと一緒に行くべきだと思います - あなたが望むならば - 実行時に店頭からそれらを受け取った直後に凍結することによってもreadonlyを保証します(http://www.2ality .com/2013/08/protection-objects.html)。 – Amid

+0

どこにでも定義すればReadonlyで私の問題を解決します。しかし、誰かがそれを正しく定義することを忘れた場合、私はタイプスクリプトがそれを拾いたいと思います。それが(私の例では上記のように)それをしなければ、私は開発者がどこかでそれを上回るだろうと確信しています。 私はすでにいくつかのフリーズライブラリーを使ってランタイムチェックをしていますが、私はコンパイル時にそれを持っていたいと思います。 – KwintenP

関連する問題