Подтвердить что ты не робот

Как вы указываете, что свойство класса является целым числом?

Я экспериментирую с TypeScript, и в процессе создания класса с полем "ID", которое должно быть целым числом, я немного запутался.

Во-первых, в Visual Studio 2012 с плагином TypeScript я вижу "int" в списке типов intelliSense. Но я получаю ошибку компиляции, в которой говорится, что "имя" int "не существует в текущей области".

Я рассмотрел спецификации языка и посмотрел только следующие примитивные типы: number, string, boolean, null и undefined. Нет целочисленного типа.

Итак, у меня остались два вопроса:

  • Как я могу указать пользователям моего класса, что конкретное поле является не просто "числом", а целым числом (и никогда не плавающей точкой или десятичным числом)?

  • Почему я вижу "int" в списке intellisense, если он не является допустимым типом?

Обновление. Все ответы, которые я получил до сих пор, касаются того, как JavaScript не имеет типа int, было бы сложно обеспечить тип int во время выполнения... Я все это знаю. Я спрашиваю, есть ли способ TypeScript предоставить аннотацию пользователям моего класса, что это поле должно быть целым числом. Возможно, комментарий какого-то определенного формата?

4b9b3361

Ответ 1

  • Я думаю, что нет прямого способа указать, является ли число целым или с плавающей запятой. В разделе 3.2.1 TypeScript мы можем видеть:

    "... Тип примитива Number соответствует аналогично названному примитиву JavaScript и представляет значения с плавающей запятой с 64-разрядным значением IEEE 754 с двойной точностью..."

  • Я думаю, что int является ошибкой в ​​Visual Studio intelliSense. Правильно - number.

Ответ 2

TypeScript - это надмножество JavaScript, у которого нет понятия int. Он имеет только понятие числа с плавающей точкой.

Философски, объем работы, которую должен был выполнить компилятор для принудительного применения только целых чисел для типа типа TypeScript, мог бы быть массовым, и в некоторых случаях во время компиляции было бы невозможно гарантировать, что только целые числа было бы назначено, поэтому невозможно надежно добавить int в TypeScript.

Когда вы сначала получаете intelliSense в Visual Studio, инструментарий не может определить, что подавать, поэтому вы получаете все, включая int, но как только вы имеете дело с чем-то известного типа, вы получите разумный intelliSense.

Примеры

var myInt: number;
var myString: string;

myInt. // toExponential, toFixed, toPrecision, toString
myString. // charAt, charCodeAt, concat, indexOf, lastIndexOf, length and many more...

Ответ 3

В TypeScript нет integer или integer float но есть number тип, как в JavaScript. Но если вы хотите сообщить программисту, что ожидаете integer тип, вы можете попробовать использовать псевдонимы типа

type integer = number;
type float = number;

// example:
function setInt(id: integer) {}

но это все еще number тип, и вы можете получить число с float.

Часть описания из документации:
"Псевдоним фактически не создает новый тип - он создает новое имя для ссылки на этот тип. Псевдоним примитива не очень полезен, хотя его можно использовать как форму документации".

Ответ 4

Ну, как вы видели, typescript не плавают данные типа, такие как язык javascript. Используйте только number, которые охватывают все int и double в одно и то же время; возможно, вы должны сделать функцию, которая принимает число и проверяет его, если это int или double, возвращая некоторое состояние в случае ошибки/успеха. Что-то вроде этого как метод вашего класса:

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, например. Если вы этого не хотите, возможно, вы должны преобразовать его в строку и попытаться найти ..

Ответ 5

В 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/

Ответ 6

int был зарезервирован для использования в будущем в более ранних версиях javascript (ECMAScript, если хотите). Но это правильное слово сейчас (где "сейчас" приравнивается к "в последней спецификации").

Например, в 262 году он все еще был зарезервирован, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Было бы неплохо добавить в typcript реализованный тип данных int но со всеми доступными правилами проверки типов и приведения типов.