2016-08-03 4 views
4

私は次のクラス定義を持っています、私はこのようにそれを使用するTypescriptでは、なぜ読み込み専用として定義されているクラスのプロパティを設定する必要がありますか?

他の場所で私のコードで
class Department 
{ 
    name: string; 
    id: string; 

    get prefix(): string 
    { 
     return !isNaN(parseFloat(this.id)) ? "n" : "i" ; 
    } 
} 

してみてください:

getDepartmentList(): Department[] { 
    return [ 
     { 
      "name": "Dept 1", 
      "id": "1000" 
     } 
    ]; 
} 

しかし、私は次のエラーを取得する:

Type '{ "name": string; "id": string; }' is not assignable to type 'Department'. Property 'prefix' is missing in type '{ "name": string; "id": string; }'.

本当の問題はTypescriptの理解が不足していることですが、なぜコンパイラがゲッター関数をプロパティとみなして、それ?

答えて

4

あなたのクラス部門はタイプ部門を作成しています。 nameidおよびprefixを含むように定義しています。 getDepartmentListに返すオブジェクトにはprefixが含まれていないため、Departmentとは構造的に互換性がありません。したがって、エラーが発生します。

Departmentタイプの宣言では、prefixプロパティが使用可能であると仮定していると思います。これはそうではなく、typescriptのような動的なクラス割り当てはありません。あなたが言うオブジェクトは特定の型であり、実際にはその型を満たすことを自分自身で確認する必要があります。

あなたはそれをこのような何か行うことができます:あなたはそれらのオブジェクトは、すべてのprefixプロパティを持つことになりますため、省クラスから新しいオブジェクトをインスタンス化している。ここ

class Department 
{ 
    constructor(public name:string, public id:string){ } 

    get prefix(): string 
    { 
     return !isNaN(parseFloat(this.id)) ? "n" : "i" ; 
    } 
} 

function getDepartmentList(): Department[] 
{ 
    return [new Department("Dept 1", "1000")]; 
} 

を。

コンストラクタシグネチャでアクセス修飾子を使用すると、引数として扱われるのではなく、そのパラメータのプロパティを作成するようにtypescriptに指示します。

それはと同等です:

class Department 
{ 
    name: string; 
    id:string; 

    constructor(name:string, id:string){ 
     this.name = name; 
     this.id = id; 
    } 

    get prefix(): string 
    { 
     return !isNaN(parseFloat(this.id)) ? "n" : "i" ; 
    } 
} 
+0

はあなたにアレックスをありがとう!私は、私が「プレフィックス」を関数ではなくプロパティとして見たという事実から私の混乱が生じたと思うので、インスタンス化時にそれを割り当てなければならないとは思わなかった。 –

+0

通常の関数であっても、Department型のオブジェクトに存在することを確認する必要があります。これは、ここのパターンに従ってDepartment型の一部として宣言されるためです。 – Alex

+0

ここ数年、C#の開発をしてきた人にとっては、これはまったく直感的ではないようです。 –

関連する問題