2017-09-08 3 views
1

せずに文字列として関数名を取得するために私は(ここで入力された)typescriptですでFunction.name documentation活字体:どのようにTS2339エラー

const o = { 
    foo(){} 
}; 
o.foo.name; // "foo"; 

で問題を次の例が見つかりました:私が欲しいとき

const o: { foo:() => void } = { 
     foo:() => { 
     } 
    }; 
    o.foo.name; 

が来ます検索するには o.foo.name、ここで私はエラーが発生します

TS2339(プロパティ "name"は存在しません)

どのように対処すればいいですか? 「foo」というプロパティをキャストすることを避けたい(<any>o.foo).name

PS:リファクタリングのために型を保持するのがユースケースです。たとえば、次のようにリファクタリングすることは安全である:

spyOn(o, (<any>o.foo).name) 

この1つはない

spyOn(o, "foo") 

PS 2ですが:関数名を取得すると、TS上の問題となる可能性がありそうです:Get name of function in typescript

+0

あなたのコードは、最新の活字体で正常に動作し、あなたが投稿しています完全なコード?多分他の問題がありますか?または、以前のバージョンのTS –

+0

@ TitianCernicova-Dragomir typescript 2.3.3を使用していますが、 "target": "es5"をtsconfig.jsonに使用しています。これはプロパティ名が欠落していると考えられる理由です。 –

答えて

1

このコードは、新しいバージョンのJavascriptでのみ機能するという問題があります。 typescriptコンパイラの設定でターゲットをes2015に変更すると、問題は解決しません。 es5をターゲットに設定した場合、そのバージョンの定義には、古いJavascriptランタイムでは機能しない可能性があるので、nameプロパティは含まれません。

es2015をターゲットに設定しても問題ありません。そうでない場合は、es5で動作する別のソリューションを用意する必要があります。

このプロパティをサポートする環境をターゲットにしていても、すべての機能に対してes2015の実装がまだ信頼されていない場合は、不足しているプロパティのFunctionインターフェイスを追加することができます。あなたのいずれかのファイルのトップレベルでは、Functionインターフェイスを再定義することができ、これは余分なプロパティを追加し、デフォルトの定義にマージされます。

interface Function { 
    /** 
    * Returns the name of the function. Function names are read-only and can not be changed. 
    */ 
    readonly name: string; 
} 
+0

私はes5をtsconfig.jsonに向けていました...ありがとう –

2

ポストES2015、これは:

const o: { foo:() => void } = { 
    foo:() => { } 
}; 
console.log(o.foo.name); 

はうまく動作するはずです。

Typescript Playgroundにチェックを入れ、JavaScriptを確認してください。あなたが言及したfoo例の共通セクションが表示されます。

ここ

がきれい、コンソールです:

enter image description here


プリES2015、これは動作しないだろうと私はターゲットポストES2015がある場合は、それをキャストしなければならないと思いますオプションではありません。