답변:
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에 유용합니다. 이를 통해 사용자는 반환 값을 안전하게 검사 할 수 있습니다.
unknown
와 object
나는 당신이합니다 (contravariance 및 공분산의 측면에서에서 얻고있는 것을 볼 생각하지만 @nawfal 예를 들어, 어떤 개체가 입력 양도 할 object
에 대한 있지만 unknown
어떤 개체 또는 원시 할당 할 수있다 - 유사하게 unknown
할당 할 수 있습니다 any
또는 자체 object
에 할당 할 수있다 dynamic
) 또는 자체. 참고로 TS 문서 unknown
가 실제로 모든 유형을 포함하지 않기 때문에 왜 TS 문서 가 최상위 유형으로 언급되는지 불분명 합니다. ¯_ (ツ) _ / ¯
알 수없는 것과 다른 것의 차이점은 다음과 같습니다.
마찬가지로
any
모든 값은 다음 과 같이 지정할 수 있습니다unknown
. 그러나와 달리any
type을 사용하여 값의 속성에 액세스unknown
하거나 호출 / 구문 할 수 없습니다. 또한 유형의 값은 또는unknown
에만 할당 할 수 있습니다 .unknown
any
당신이 사용해야 할 때의 질문에 대답하려면 unknown
이상을 any
:
이것은 "이것은 임의의 값이 될 수 있으므로 사용하기 전에 어떤 유형의 검사를 수행 해야합니다 "라고 신호하려는 API에 유용 합니다 . 이를 통해 사용자는 반환 된 값을 안전하게 검사 할 수 있습니다.
유형 변수 확인 유형에 대한 예 는 TypeScript 3.0 공지 를 참조하십시오.unknown
과 자세한 설명 참조하십시오.
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();
any
같습니다dynamic
과unknown
같다object
. 나는unknown
그것이 더 안전한 유형이기 때문에 좋아 합니다. 그래도 혼란스러운 이름.