[解決済み] TypeScriptのInterface Function Property。何が違うの?
質問
このコードで、InterfaceA型の定数への代入はうまくいくのに、InterfaceB型の定数への代入はなぜエラーを投げるのか、どなたか説明してください。
interface InterfaceA {
doSomething (data: object): boolean;
}
interface InterfaceB {
doSomething: (data: object) => boolean;
}
function doIt (data: { type: string; }): boolean {
return true;
}
const A: InterfaceA = {
doSomething: doIt
};
const B: InterfaceB = {
doSomething: doIt
};
私には、どちらのインターフェースも定義が同じで、表記が違うだけだと思います。
もしこれがTypeScriptのバグではなく、本当の理由があるのなら、2つ目の質問に移ろう。 doSomething"はオプションで、関数かRegExpのどちらかであることを指定する必要がある。
interface InterfaceB {
doSomething?: ((data: object) => boolean) | RegExp;
}`
InterfaceAの記法で、どうすれば実現できるのでしょうか?
どのように解決するのですか?
1.) という違いがあります。 メソッド と 関数プロパティ を宣言します。
interface InterfaceA {
doSomething(data: object): boolean; // method declaration
}
interface InterfaceB {
doSomething: (data: object) => boolean; // function as property declaration
}
2.) TypeScript 2.6 は、より強い型付けを行うためのコンパイラフラグを導入しています。 サウンド 関数の型があります。
下
--strictFunctionTypes
関数型パラメータの位置がチェックされる 二変量ではなく、対数変量 . その より厳格なチェック が適用されます。 すべての関数型 , ただし に由来するもの。 メソッドまたはコンストラクタの宣言 . (私の強調)
一般的にそれは良いことなんですね。あなたの例で言えば
InterfaceB
は次のような契約を結んでいます: "一般的な
object
は互換性があります" 。しかし、ある関数に
doIt
を期待するものである。
特定
オブジェクトの型は
{ type: string; }
を入力とする。を使用するクライアントは
InterfaceB
を渡すだけで十分だと考えています。
object
しかし、実装
doIt
はより具体的なものを望んでいるので、当然のことながらこのエラーが発生します。
でエラーが発生しないのはなぜでしょう?
InterfaceA
?
それに対して
メソッド
のように
doIt
で
InterfaceA
は
除く
から
--strictFunctionTypes
というのは、実用的な理由からです。の組み込みメソッドであまりペンダントにならないような型システムを開発者は決定しました。
Array
など、正しさと生産性を両立させるために、様々な工夫が凝らされています。
そこで、より強い型を優先して、あなたの場合に有効な次のような型がいいと思います( サンプル ):
interface InterfaceB {
doSomething: ((data: { type: string; }) => boolean) | RegExp;
}
関連
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】インプリメントとエクステンド。いつ使う?その違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TypeScriptで、「extends keyof」と「in keyof」はどういう意味ですか?
-
[解決済み] Typescript ReferenceError: exports が定義されていません。
-
[解決済み] TypeScriptでオブジェクトを初期化する方法
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] AngularでNameServiceのプロバイダがない
-
[解決済み] TypeScriptのクラス型チェック
-
[解決済み】TypeScriptのコンパイルでExperimental decoratorsの警告が出る。
-
[解決済み】文字列の値を持つenumの作成
-
[解決済み】タイプからプロパティを除外する