149

私は を試していて、であるはずTypeScriptのフィールドを持つクラスを作成する過程で、少し混乱しました。IDinteger

まず、TypeScript プラグインを使用した Visual Studio 2012 ではint、intelliSense の型リストに表示されます。しかし、次のようなコンパイル エラーが発生します。

名前「int」は現在のスコープに存在しません。

言語仕様を確認したところnumber、 、stringbooleannull、およびundefined. タイプなしinteger

だから、私は2つの質問が残っています:

  1. 特定のフィールドが単なる aではなく(ポイントや数値ではない)ことをクラスのユーザーにどのように示す必要がありますか?numberintegerfloatingdecimal

  2. int有効な型ではないのに、なぜ IntelliSense リストに表示されるのですか?

更新:これまでに得たすべての回答は、どのようJavaScriptに int 型を持たないかに関するものでありint、実行時に型を強制するのは難しいでしょう...私はそれをすべて知っています. クラスのTypeScriptユーザーに、このフィールドがinteger. おそらく、特定の形式のコメントですか?

4

9 に答える 9

143
  1. 数値が整数か浮動小数点かを直接指定する方法はないと思います。TypeScript仕様のセクション3.2.1では、次のことがわかります。

    「...Numberプリミティブ型は、同様の名前のJavaScriptプリミティブ型に対応し、倍精度64ビット形式のIEEE754浮動小数点値を表します...」

  2. intVisualStudiointelliSenseのバグだと思います。正しいのはnumberです。

于 2012-10-15T15:05:28.843 に答える
40

TypeScriptはJavaScriptのスーパーセットであり、intの概念はありません。浮動小数点を持つ数値の概念しかありません。

一般的に言えば、TypeScript int型に整数のみを適用するためにコンパイラが実行する必要のある作業量は、潜在的に膨大になる可能性があり、場合によっては、コンパイル時に整数のみが割り当てられることを保証できないこともあります。そのためint、TypeScriptにを確実に追加することはできません。

Visual Studioで最初にintelliSenseを取得するとき、ツールが何を提供するかを決定することはできないため、intを含むすべてを取得しますが、既知のタイプの何かを処理すると、賢明なintelliSenseを取得できます。

var myInt: number;
var myString: string;

myInt. // toExponential, toFixed, toPrecision, toString
myString. // charAt, charCodeAt, concat, indexOf, lastIndexOf, length and many more...
于 2012-10-15T15:06:00.177 に答える
24

TypeScript では、マーカーを使用して不透明型と呼ばれることがあるものを概算できます。

// Helper for generating Opaque types.
type Opaque<T, K> = T & { __opaque__: K };

// 2 opaque types created with the helper
type Int = Opaque<number, 'Int'>;
type ID = Opaque<number, 'ID'>;

// using our types to differentiate our properties even at runtime
// they are still just numbers
class Foo {
    someId: ID;
    someInt: Int;
}

let foo = new Foo();

// compiler won't let you do this due to or markers
foo.someId = 2;
foo.someInt = 1;

// when assigning, you have to cast to the specific type
// NOTE: This is not completely type safe as you can trick the compiler 
// with something like foo.someId = 1.45 as ID and it won't complain.
foo.someId = 2 as ID;
foo.someInt = 1 as Int;

// you can still consume as numbers
let sum: number = foo.someId + foo.someInt;

これを行うと、プロパティが期待する型をコード内でより明確にすることができ、コンパイラはキャストなしでプリミティブ値を割り当てることを許可しません。これにより、追加の .js 出力が生成されることはありません。また、値が基づいている型として値を使用して使用することもできます。この例では数値を使用していますが、文字列やその他の型にも使用できます。

この例では、コンパイラをだまして Int または Id ではないものを受け入れるようにすることができますが、1.45 を Int などとして割り当てようとすると、コンパイラは飛び出します。ランタイム検証を提供する値を作成するために使用するヘルパー関数を作成するオプションもあります。

「マーク付き」タイプを作成するには、さまざまな方法があります。ここに良い記事があります: https://michalzalecki.com/nominal-typing-in-typescript/

于 2018-05-25T03:49:21.957 に答える
2

さて、ご覧のとおり、typescript は javascript 言語のような float データ型を持っていません。すべてを同時にnumberカバーするだけです。おそらく、エラー/成功の場合に何らかの状態を返すことにより、数値を取り、それがまたはであるかどうかをチェックする関数を作成する必要があります。あなたのクラスのメソッドとしてこのようなもの:intdoubleintdouble

function SetN(x:number) {
   var is_int = parseInt(x) === parseFloat(x);
   if(is_int) this.n = x;
   return is_int;
}

//..
y = 10.5;
if(SetN(y)) {
  //OK
} else {
   //error not set y isn't a int
}

注:それは機能しません。10.0たとえば、実際にそれが必要ない場合は、文字列に変換して..

于 2012-10-15T15:09:44.687 に答える
1

int以前のバージョンの javascript (必要に応じて ECMAScript)の将来の使用キーワードのために予約されていました。しかし、それは今では有効な言葉です (「今」は「最新の仕様で」に相当します)。

たとえば、262 ではまだ予約されていました。 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

intデータ型を実装し、コンパイル時の型チェックとキャスト規則をすべて利用できるようにすると、typescript に追加するのに便利です。

于 2012-10-15T15:30:34.133 に答える