>  기사  >  웹 프론트엔드  >  TypeScript에서 알 수 없음과 임의의 차이점에 대해 이야기해 보겠습니다.

TypeScript에서 알 수 없음과 임의의 차이점에 대해 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2021-10-27 11:14:492156검색

이 기사는 TypeScript에서 Unknown과 Any를 비교하고 Unknown과 Any의 차이점에 대해 이야기하는 데 도움이 될 것입니다.

TypeScript에서 알 수 없음과 임의의 차이점에 대해 이야기해 보겠습니다.

우리는 any 유형의 변수가 어떤 값에도 할당될 수 있다는 것을 알고 있습니다. any 类型的变量可以被赋给任何值。

let myVar: any = 0;
myVar = '1';
myVar = false;

TypeScript 指南并不鼓励使用 any,因为使用它就会丢掉类型限制--而需要类型限制也是我们选择 TypeScript 的一个原因,所以就是有点背道而驰。

TypeScript(3.0 及以上版本)还提供了一种类似于 any 的特殊类型 unknown。 我们也可以为 unknown 类型变量分配任何值:

let myVar: unknown = 0;
myVar = '1';
myVar = false;

那现在就有一个问题了, anyunknown 有啥区别?

1. unknown vs any

为了更好地理解 unknownany 之间的区别,我们先从编写一个想要调用其唯一参数的函数开始。

我们将 invokeAnything() 的唯一参数设置为 any 类型

function invokeAnything(callback: any) {
  callback();
}

invokeAnything(1); // throws "TypeError: callback is not a function"

因为 callback 参数是任何类型的,所以语句 callback() 不会触发类型错误。我们可以用any 类型的变量做任何事情。

但是运行会抛出一个运行时错误:TypeError: callback is not a function1 是一个数字,不能作为函数调用,TypeScript并没有保护代码避免这个错误

那既允许 invokeAnything() 函数接受任何类型的参数,又要强制对该参数进行类型检查防止上面这种报错,要怎么做呢?

有请 unknown 大哥来控场。

any 一样,unknown 变量接受任何值。但是当尝试使用 unknown 变量时,TypeScript 会强制执行类型检查。这不就是我们想要的嘛。

function invokeAnything(callback: unknown) {
  callback();
  // Object is of type 'unknown'
}

invokeAnything(1);

因为 callback 参数的类型是 unknown,所以语句 callback() 有一个类型错误 :Object is of type 'unknown'。 与 any 相反,TypeScript会保护我们不调用可能不是函数的东西。

在使用一个 unknown 类型的变量之前,你需要进行类型检查。在这个例子中,我们只需要检查callback 是否是一个函数类型。

function invokeAnything(callback: unknown) {
  if (typeof callback === 'function') {
    callback();
  }
}

invokeAnything(1);

2. unknown 和 any 的心智模式

说实话,当我学习的时候,我很难理解 unknown 。它与 any 有什么不同,因为这两种类型都接受任何值

下面是帮助我理解两者区别的规则:

  • 可以将任何东西赋给 unknown 类型,但在进行类型检查或类型断言之前,不能对 unknown 进行操作
  • 可以把任何东西分配给any类型,也可以对any类型进行任何操作

上面的例子正好说明了 unknown 和 `any 之间的相似和不同。

unknown 示例:

function invokeAnything(callback: unknown) {
  // 可以将任何东西赋给 `unknown` 类型,
  // 但在进行类型检查或类型断言之前,不能对 `unknown` 进行操作
  if (typeof callback === 'function') {
    callback();
  }
}

invokeAnything(1); // You can assign anything to `unknown` type

类型检查 typeof callback === 'function',检查 callback 是否为函数,如果是,则可以调用。

any 示例:

function invokeAnything(callback: any) {
  // 可以对 `any` 类型执行任何操作
  callback();
}

invokeAnything(1); // 可以把任何东西分配给`any`类型

如果 callbackany, TypeScript 就不会强制 callback() 语句进行任何类型检查。

3.总结

unknownany 是2个特殊的类型,可以容纳任何值。

推荐使用 unknown 而不是 any,因为它提供了更安全的类型--如果想对 unknownrrreee

TypeScript 가이드에서는 any의 사용을 권장하지 않습니다. 이를 사용하면 유형 제한이 사라지고 유형 제한이 필요한 것도 우리가 TypeScript를 선택하므로 약간 반대 방향으로 진행됩니다.

TypeScript(버전 3.0 이상)는 any와 유사한 특수 유형 unknown도 제공합니다. unknown 유형 변수에 어떤 값이든 할당할 수도 있습니다. rrreee

이제 질문이 있습니다. anyunknown의 차이점은 무엇인가요? ? 🎜

1. 알 수 없음과 모두

🎜 알 수 없음모두의 차이점을 더 잘 이해하기 위해 먼저 시작하겠습니다. 호출하려는 유일한 인수가 있는 함수를 작성합니다. 🎜🎜invokeAnything()의 유일한 매개변수를 any 유형으로 설정했습니다. 🎜rrreee🎜 callback 매개변수는 모든 유형이므로 callback() 문은 유형 오류를 발생시키지 않습니다. any 유형의 변수로 무엇이든 할 수 있습니다. 🎜🎜하지만 실행하면 런타임 오류가 발생합니다: TypeError: 콜백은 함수가 아닙니다. 1은 숫자이며 함수로 호출할 수 없습니다. TypeScript는 이 오류를 피하기 위해 코드를 보호하지 않습니다.🎜🎜이는 invokeAnything() 함수가 모든 것을 허용할 뿐만 아니라 위의 오류를 방지하기 위해 이 매개변수에 대한 유형 검사를 수행하는 방법은 무엇입니까? 🎜🎜알 수 없음 형제가 필드를 제어하도록 초대되었습니다. 🎜🎜 any와 마찬가지로 unknown 변수는 모든 값을 허용합니다. 그러나 TypeScript는 알 수 없는 변수를 사용하려고 할 때 유형 검사를 시행합니다. 이것이 우리가 원하는 것이 아닌가? 🎜rrreee🎜 callback 매개변수의 유형이 알 수 없음이므로 callback() 문에 유형 오류가 있습니다: Object is of '알 수 없음'을 입력하세요. any와 달리 TypeScript는 함수가 아닌 것을 호출하지 못하도록 보호합니다. 🎜🎜알 수 없음 유형의 변수를 사용하기 전에 유형 검사를 수행해야 합니다. 이 예에서는 콜백이 함수 유형인지 확인하기만 하면 됩니다. 🎜rrreee

2. 미지의 정신 모델

🎜솔직히 배울 때는 알 수 없음을 이해하기가 어려웠습니다. 두 유형 모두 모든 값을 허용하므로 any와 어떻게 다른가요? 🎜🎜두 유형의 차이점을 이해하는 데 도움이 되는 규칙은 다음과 같습니다. 🎜
  • 모든 항목을 에 할당할 수 있습니다. 알 수 없는 유형이지만 유형 확인이나 유형 어설션 없이는 unknown에 대해 어떤 작업도 수행할 수 없습니다.
  • 모든 항목을 모든
  • 코드>에 할당할 수 있습니다. 유형을 사용하면 any 유형
에 대해 모든 작업을 수행할 수도 있습니다.🎜위의 예는 unknown과 `any other' 사이의 유사성을 보여줍니다. 🎜🎜알 수 없음 예: 🎜rrreee🎜Type check typeof callback === 'function', callback이 함수인지 확인하세요. 그렇다면, 그러면 호출될 수 있습니다. 🎜🎜any 예: 🎜rrreee🎜 callbackany인 경우 TypeScript는 callback() 문을 강제로 실행하지 않습니다. 모든 유형 검사를 수행합니다. 🎜

3. 요약

🎜unknownany는 모든 값을 보유할 수 있는 2가지 특수 유형입니다. 🎜🎜더 안전한 유형을 제공하므로 any 대신 unknown을 사용하는 것이 좋습니다. unknown에 대해 작업하려면 다음을 사용해야 합니다. 유형을 지정하거나 특정 유형으로 범위를 좁힙니다. 🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 TypeScript에서 알 수 없음과 임의의 차이점에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제