Как вы указываете, что свойство класса является целым числом?
Я экспериментирую с TypeScript, и в процессе создания класса с полем "ID", которое должно быть целым числом, я немного запутался.
Во-первых, в Visual Studio 2012 с плагином TypeScript я вижу "int" в списке типов intelliSense. Но я получаю ошибку компиляции, в которой говорится, что "имя" int "не существует в текущей области".
Я рассмотрел спецификации языка и посмотрел только следующие примитивные типы: number, string, boolean, null и undefined. Нет целочисленного типа.
Итак, у меня остались два вопроса:
-
Как я могу указать пользователям моего класса, что конкретное поле является не просто "числом", а целым числом (и никогда не плавающей точкой или десятичным числом)?
-
Почему я вижу "int" в списке intellisense, если он не является допустимым типом?
Обновление. Все ответы, которые я получил до сих пор, касаются того, как JavaScript не имеет типа int, было бы сложно обеспечить тип int во время выполнения... Я все это знаю. Я спрашиваю, есть ли способ TypeScript предоставить аннотацию пользователям моего класса, что это поле должно быть целым числом. Возможно, комментарий какого-то определенного формата?
Ответы
Ответ 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
но со всеми доступными правилами проверки типов и приведения типов.
Ответ 7
Вот реализация интерфейса номера, который не делает бокса. Я думаю, что можно было бы использовать этот проект для создания типа Integer