2016-10-24 8 views
0

TypeScriptがJavascriptのスーパーセットであると主張されています。 スタックについてはquestionです。 ここに仕様からの引用があります。Typescript:100%有効なJavaScriptコードであるのにこのコードが例外をスローする理由

TypeScriptはJavaScriptの構文砂糖です。 TypeScript構文は、ECMAScript 2015(ES2015)構文の スーパーセットです。すべてのJavaScriptプログラム もTypeScriptプログラムです。

だから私の理解では、任意のスタンドアロンのTSCコンパイラによって(いくつかの追加のフラグとすることができる)、すなわちコンパイルし、有効なtypescriptですコードとして扱うことができるのJavaScriptファイルということです。

しかし、ここでは、JSコードの例です:

class ClassA {} 
ClassA.prototype.ping =() => {console.log('PING')} 

有効ではJavaScriptしかし、あなたはtypescriptですとそれをコンパイルしようとするだろう場合、あなたが買ってあげる: error TS2339: Property 'ping' does not exist on type 'ClassA'

一つは、インターフェイスを宣言することができますClassAが実装できるクラスもありますが、これはクラスやプロトタイプの構文を組み合わせたようなコードを書くのは非常に典型的ではありませんが、これはtscでコンパイルしている間にエラーを発生させる有効なjsコードの例です。

ですから、これが仕様からの引用にどのように矛盾しないのですか?

+0

それが有効JSかもしれない余分な情報については、型システムに伝えることができ、それは良いJSではありません。クラスを使用している場合は、プロトタイプ操作を行わないでください。真のコンストラクタ関数+プロトタイプコードを書くか、適切なクラスコードを使用してください。かなり確実なタイスクリプトはあなたに*本当に変な糞(tm)*をやってもらうことを妨げています。 'クラスClassA {ping(){console.log( 'PING'); }、...} ' –

+0

将来の参考資料として、なぜTSはこのコードでエラーを投げるのですか?奇妙な告発的なトーンなしで、この同じ質問をするより簡単な方法でした。 – Retsam

+0

@Retsam確かに、告発的な注釈を取り除くためにタイトル(少なくとも)を編集させてください、それはどんな告発でもありません。 – shabunc

答えて

5

TypeScriptは、構文のスーパーセットであり、JavaScriptの実行時動作を変更しません。だから、あなたがJavaScriptで書いた式や文、宣言はいずれもであり、構文的にはである。

これは、すべてのJSコードが警告なしのTypeScriptであるとみなされるわけではありません。結局のところ、活字体の主要な目標は

var s = "hello world" * 423; 
var t = "qzz".subtr(2); 
var u = [1, 2, 3] + 5; 
var w = window.navgtator; 

のように悪いの構造を特定することである。これらは、JavaScriptの表現、彼らはただ人々が実際に行うにはしたくないことは望ましくない実行時の動作を持って起こるすべて「有効」です。

は、活字体でいつものように、あなたは

class ClassA {} 
// Declare additional method 
interface ClassA { ping(): void; } 
// OK 
ClassA.prototype.ping =() => {console.log('PING')} 
+1

A [discussion](https:// github。com/Microsoft/TypeScript/issues/6373)はここにあります。私は最後にコメントしたと思います。 – sabithpocker

+1

厳密に言えば、警告ではなく、コンパイル時のエラーです。私は議論していない、ただ言っている。 – shabunc

+1

TSには警告対エラーという概念はありません。私はここで "警告"と言いますが、TSはコードを出力します(noEmitOnErrorsをオンにしない限り)。 –

関連する問題