2017-11-11 10 views
0

私は、TypescriptのPluralsitesコースを続けています。インターフェースで作業する場合、私は次のようしている:Typescriptインターフェイス任意メソッドプロパティ未定義

interface Book { 
    id: number; 
    title: string; 
    author: string; 
    available: boolean; 
    category: Category; 
    pages: number; 
    markDamaged: DamageLogger; 
} 

interface DamageLogger { 
    (reason: string): void; 
} 

私は今のように本を宣言しています:

let myBook: Book = { 
    id: 5, 
    title: 'Pride and Prejudice', 
    author: 'Jane Austen', 
    available: true, 
    category: Category.Fiction, 
    pages: 250, 
    markDamaged: (reason: string) => console.log('Damaged: ' + reason) 
}; 

myBook.markDamaged('missing back cover'); 

すべてが順調ですが、すぐに私はmarkDamagedためのインタフェースを変更すると、オプションであることを以下のように:

interface Book { 
    id: number; 
    title: string; 
    author: string; 
    available: boolean; 
    category: Category; 
    pages: number; 
    markDamaged?: DamageLogger; 
} 

コンパイラは、この行に吠える:

myBook.markDamaged('missing back cover'); 

と、markDamagedプロパティはおそらく定義されていないと言います。私は疑問符を削除し、すべてが元気です。

ここで何が起こっていますか?コースのどこか別の場所でオプションのパラメータを使用していますが、インターフェイスで作業する場合はこれが表示されます。

ありがとうございます。

+0

markDamagedはオプションとマークされているので、オブジェクトに存在することはできません。存在しない場合は未定義です。だから、それを呼び出す前にそれが存在することを確認する必要があります。 –

答えて

0

は、あなたがBookがまたはmarkDamaged財産があってもなくてもよいということを意味します。コンパイラでは、BookmyBookを含む)が実際にmarkDamagedを持っていることを確認してから呼び出すことができます。このチェックは、--strictNullChecksコンパイラオプションが設定されている場合にのみ有効です。

これは動作します

interface Book { 
    markDamaged: DamageLogger 
} 
interface DamageLogger { 
    (reason: string): void 
} 

let myBook: Book = { 
    markDamaged: (reason: string) => console.log('Damaged: ' + reason) 
} 
// myBook: Book; it definitely has markDamaged 
myBook.markDamaged('missing back cover') 

これがないの

interface Book { markDamaged?: DamageLogger } 
// ... 
// myBook: Book; Books do not definitely have markDamaged 
myBook.markDamaged('...') 

をが、これはこれも動作します

if(myBook.markDamaged) { 
    // Now we know it's there, we can call it 
    myBook.markDamaged('...') 
} 

行います

interface Book { markDamaged?: DamageLogger } 
// don't say it's a Book 
// inferred: myBook: { markDamaged: (reason: String) => void } 
// TypeScript's type system is structural, not nominal 
// The identity of a type is in it's structure, not name 
// myBook's type says that it definitely has markDamaged 
let myBook = { markDamaged: (reason: String) => console.log('Damaged: ' + reason) } 
myBook.markDamaged('...') 

function read(b: Book) {} 
// myBook's type is a subtype of Book, because a Book can be missing markDamaged but myBook definitely has it. 
read(myBook) 
+0

男、これは本当に奇妙です。インターフェース内のpagesプロパティをオプションにすると、私はそれをprobと呼ぶことができません: myBook.pages = 10. 'markDamaged'はメソッドなので、それは好きではありません。 –

+0

コンパイラオプションがトリックでした。 –

+0

プロパティを設定しています。見つからない場合は作成されます。オプションであるかどうかは関係ありません。 – HTNW

0

これは、定義されていることが保証されていないためです。まずそれをチェックし、コンパイラは不平を言ってはいけません。あなたがmarkDamaged?: DamageLoggerを述べる場合

if (myBook && myBook.markDamaged) { 
    myBook.markDamaged('missing back cover'); 
} 
関連する問題