私はタイプスクリプトの初心者であり、 docs--noImplicitThis
からコンパイルフラグについて学んでいますが、期待どおりに動作しないように見えるケースに遭遇しました.誰かが私が正しくできる方法を説明してください.タイプ チェック バウンド関数:
したがって、ドキュメントと同様の例を使用してください。次のコードでは、正しく実行されているにもかかわらず、型エラーが発生します (型チェックがスキップされた場合)。
type Card = {
suit: string;
card: number;
}
class Deck {
suits: string[];
cards: number[];
constructor() {
this.suits = ["hearts", "spades", "clubs", "diamonds"];
this.cards = Array(52);
}
cardPicker(this: Deck): Card {
const pickedCard: number = Math.floor(Math.random() * 52);
const pickedSuit: number = Math.floor(pickedCard / 13);
return { suit: this.suits[pickedSuit], card: pickedCard % 13 };
}
}
// this could be a function that takes a callback as an
// argument, i.e. onClick
function runner(f: (this: Deck) => Card) : Card {
return f();
}
const deck: Deck = new Deck()
const pickedCard: Card = runner(deck.cardPicker.bind(deck));
console.log("card: " + pickedCard.card + " of " + pickedCard.suit);
関連する 2 つの問題があります。
まず、上記のコードで:
関数が正しくバインドされているにもかかわらずf()
、runner
関数で型エラーが発生します。this
The 'this' context of type 'void' is not assignable to method's 'this' of type 'Deck'
runner
次に、コードが型チェックに合格するようにするには、関数を次のように変更してコードを変更します。
function runner(f: () => Card) : Card {
return f();
}
しかし、(誤って) に渡された関数のバインドを解除した場合runner
:
const pickedCard: Card = runner(deck.cardPicker);
コードが正しく実行されないため、本当にコンパイル エラーが必要な場合でも、コンパイル エラーは発生しません。
タイプスクリプトがクラス関数を渡す前に確実にバインドする方法はありますか?