'알 수 없음'과 '임의'


190

TypeScript 3.0은 unknown위키에 따라 유형을 소개 합니다.

unknown은 이제 기본 제공 유형이므로 예약 된 유형 이름입니다. 알 수없는 의도 된 용도에 따라 선언을 완전히 제거하거나 (새로 도입 된 알 수없는 유형을 선호하는) 다른 이름으로 바꿀 수 있습니다.

차이 무엇 unknownany? 때 우리는 사용해야 unknown이상 any?

답변:


233

PR 또는 RC 공고unknown 에서 자세한 내용 을 읽을 수 있지만 그 요지는 다음과 같습니다.

[..] 알 수없는 형식 안전 대응입니다. 알 수없는 것은 할당 할 수 있지만 알 수없는 것은 유형 주장 또는 제어 흐름 기반 축소를 제외한 다른 것 자체에는 할당 할 수 없습니다. 마찬가지로,보다 구체적인 유형을 먼저 주장하거나 좁히지 않으면 알 수없는 작업이 허용되지 않습니다.

몇 가지 예 :

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

권장 사용법은 다음과 같습니다.

TypeScript에서 가장 기능이 적은 유형을 설명하려는 경우가 종종 있습니다. 이것은 "이것은 임의의 값이 될 수 있으므로 사용하기 전에 어떤 유형의 검사를 수행해야합니다"라고 신호하려는 API에 유용합니다. 이를 통해 사용자는 반환 값을 안전하게 검사 할 수 있습니다.


35
C #을 배경에서 오는 사람은 누구나 any같습니다 dynamicunknown같다 object. 나는 unknown그것이 더 안전한 유형이기 때문에 좋아 합니다. 그래도 혼란스러운 이름.
nawfal

1
나는 이것이 비교하는 공정 것을 알고하지 않습니다 unknownobject나는 당신이합니다 (contravariance 및 공분산의 측면에서에서 얻고있는 것을 볼 생각하지만 @nawfal 예를 들어, 어떤 개체가 입력 양도 할 object에 대한 있지만 unknown어떤 개체 또는 원시 할당 할 수있다 - 유사하게 unknown할당 할 수 있습니다 any또는 자체 object에 할당 할 수있다 dynamic) 또는 자체. 참고로 TS 문서 unknown가 실제로 모든 유형을 포함하지 않기 때문에 왜 TS 문서 가 최상위 유형으로 언급되는지 불분명 합니다. ¯_ (ツ) _ / ¯
Jordan

38

알 수없는 것과 다른 것의 차이점은 다음과 같습니다.

마찬가지로 any모든 값은 다음 과 같이 지정할 수 있습니다 unknown. 그러나와 달리 anytype을 사용하여 값의 속성에 액세스 unknown하거나 호출 / 구문 할 수 없습니다. 또한 유형의 값은 또는 unknown에만 할당 할 수 있습니다 .unknownany

당신이 사용해야 할 때의 질문에 대답하려면 unknown이상을 any:

이것은 "이것은 임의의 값이 될 수 있으므로 사용하기 전에 어떤 유형의 검사를 수행 해야합니다 "라고 신호하려는 API에 유용 합니다 . 이를 통해 사용자는 반환 된 값을 안전하게 검사 할 수 있습니다.

유형 변수 확인 유형에 대한 예 는 TypeScript 3.0 공지 를 참조하십시오.unknown 과 자세한 설명 참조하십시오.


21

any 유형:

any유형은 모든 가능한 JS의 값을 나타낸다. 모든 유형은 type에 할당 할 수 any있습니다. 따라서 유형 any은 유형 시스템의 보편적 인 수퍼 타입입니다. TS 컴파일러는 입력 된 값에 대한 모든 작업을 허용합니다 any. 예를 들면 다음과 같습니다.

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

많은 경우에 이것은 TS 컴파일러에 너무 관대합니다. 즉, 런타임 오류가 발생했다고 알려진 작업을 허용합니다.

unknown 유형:

unknown타입 (처럼 나타내는 any모든 가능한 값 JS). 모든 유형은 type에 할당 할 수 unknown있습니다. 따라서 유형 unknown은 유형 시스템의 또 다른 보편적 인 수퍼 타입입니다 ( any). 그러나 TS 컴파일러 typed 값에 대한 작업을 허용하지 않습니다unknown . 또한 unknown유형은 유형에만 지정할 수 any있습니다. 예를 들면 다음과 같습니다.

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.