클래스 속성이 정수임을 어떻게 지정합니까?
TypeScript로 실험 중이며 정수 여야하는 "ID"필드가있는 클래스를 만드는 과정에서 약간 혼란 스러웠습니다.
먼저 TypeScript 플러그인을 사용하는 Visual Studio 2012에서 intelliSense 형식 목록에 "int"가 표시됩니다. 하지만 "현재 범위에 'int'라는 이름이 존재하지 않습니다."라는 컴파일 오류가 발생합니다.
언어 사양을 검토 한 결과 숫자, 문자열, 부울, null 및 정의되지 않은 기본 유형 만 표시됩니다. 정수 유형이 없습니다.
그래서 두 가지 질문이 남았습니다.
특정 필드가 단순히 "숫자"가 아니라 정수 (부동 소수점 또는 십진수가 아님)임을 클래스 사용자에게 어떻게 표시해야 합니까?
올바른 유형이 아닌 경우 인텔리 센스 목록에 "int"가 표시되는 이유는 무엇입니까?
업데이트 : 지금까지 얻은 모든 답변은 JavaScript에 int 유형이없는 방법에 대한 것입니다. 런타임에 int 유형을 적용하기가 어려울 것입니다. 이 필드가 정수 여야한다는 내 클래스의 사용자에게 주석을 제공하는 TypeScript 방법이 있는지 묻습니다. 특정 형식에 대한 의견일까요?
숫자가 정수인지 부동 소수점인지를 지정하는 직접적인 방법은 없다고 생각합니다. TypeScript 사양 섹션 3.2.1에서 다음을 볼 수 있습니다.
"... 숫자 기본 유형은 유사한 이름의 JavaScript 기본 유형에 해당하며 배정 밀도 64 비트 형식 IEEE 754 부동 소수점 값을 나타냅니다 ..."
int
Visual Studio intelliSense의 버그 라고 생각 합니다. 정답은number
입니다.
TypeScript는 int라는 개념이없는 JavaScript의 상위 집합입니다. 부동 소수점이있는 숫자의 개념 만 있습니다.
철학적으로 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...
더 없다 integer
거나 float
하지만 number
형 타이프에서 자바 스크립트처럼. 그러나 프로그래머에게 integer
유형을 예상한다고 말하고 싶다면 다음 과 같은 유형 별칭 을 사용할 수 있습니다.
type integer = number;
type float = number;
// example:
function setInt(id: integer) {}
그러나 이것은 여전히 number
유형이며 얻을 수 있습니다 float
.
문서 설명의 일부 :
"앨리어싱은 실제로 새 유형을 생성하지 않습니다. 해당 유형을 참조하기 위해 새 이름을 생성합니다. 프리미티브에 별칭을 지정하는 것은 문서의 한 형태로 사용할 수 있지만 그다지 유용하지는 않습니다."
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;
Doing this allow you to be more explicit in your code as to what types your properties expect, and the compiler won't allow you to assign a primitive value without a cast. This doesn't produce any additional .js output, and you can still consume and use the values as whatever types they are based on. In this example I'm using numbers, but you can use on strings and other types as well.
You can still trick the compiler into accepting something that isn't an Int or an Id in this example, but it should jump out if you were trying to assign 1.45 as Int or something like that. You also have the option of creating helper functions that you use to create your values to provide runtime validation.
There's a number of different ways you can create "marked" types. Here's a good article: https://michalzalecki.com/nominal-typing-in-typescript/
Well, as you have seen, typescript haven't float data type such as javascript language. Only have the number
that cover all int
and double
at same time; maybe you must make a function that take a number and check it if it's a int
or double
, by returning some state in case error/success. Something like this as method of your class:
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
}
Note: it doest not works for 10.0
e.g. If you want no really it, maybe you must conver it to string and try to find a .
.
Here is an implementation of number interface that doesn't do boxing. I think it would be possible to use this design to create an Integer type
int
was reserved for future use keyword in earlier versions of javascript (ECMAScript if you prefer). But it is a valid word now (where "now" equates to "in the latest spec").
For instance, in 262 it was still reserved, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
It would make nice addition to typescript to have an int
datatype implemented but with all compile-time type checking and casting rules available.
참고URL : https://stackoverflow.com/questions/12897742/how-do-you-specify-that-a-class-property-is-an-integer
'developer tip' 카테고리의 다른 글
자바 프로그래밍 : 자바에서 exe 호출 및 매개 변수 전달 (0) | 2020.09.25 |
---|---|
내 변경 사항 만 표시하도록 git 로그 필터링 (0) | 2020.09.25 |
iOS 6 아이콘을 유지하면서 iOS 7 앱 아이콘, 실행 이미지 및 명명 규칙 (0) | 2020.09.25 |
res.end ()는 node.js를 사용하여 express에서 호출해야합니까? (0) | 2020.09.25 |
mapStateToProps 및 mapDispatchToProps에서 ownProps 인수를 사용하는 것은 무엇입니까? (0) | 2020.09.25 |