Maison  >  Article  >  interface Web  >  Parlons de la différence entre inconnu et tout dans TypeScript

Parlons de la différence entre inconnu et tout dans TypeScript

青灯夜游
青灯夜游avant
2021-10-27 11:14:492175parcourir

Cet article vous aidera à comparer inconnu et tout dans TypeScript, et à parler des différences entre inconnu et tout, j'espère qu'il vous sera utile !

Parlons de la différence entre inconnu et tout dans TypeScript

Nous savons que les variables de type any peuvent être affectées à n'importe quelle valeur. 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 Le guide n'encourage pas l'utilisation de any, car son utilisation entraînerait la perte des restrictions de type - et la nécessité de restrictions de type est également l'une des raisons pour lesquelles nous choisissez TypeScript, donc c'est un peu dans la direction opposée.

TypeScript (version 3.0 et supérieure) fournit également un type spécial inconnu similaire à any. Nous pouvons également attribuer n'importe quelle valeur à la variable de type inconnu : rrreee

Maintenant, il y a une question, quelle est la différence entre any et inconnu ? 🎜

1. Inconnu vs tout

🎜Afin de mieux comprendre la différence entre inconnu et tout, commençons d'abord. en écrivant une fonction dont vous souhaitez appeler le seul argument. 🎜🎜Nous définissons le seul paramètre de invokeAnything() pour qu'il soit de type any 🎜rrreee🎜Parce que le paramètre callback est de n'importe quel type, le l'instruction callback() ne déclenche pas d'erreur de type. On peut tout faire avec des variables de type any. 🎜🎜Mais l'exécution générera une erreur d'exécution : TypeError : le rappel n'est pas une fonction. 1 est un nombre et ne peut pas être appelé en tant que fonction. TypeScript ne protège pas le code pour éviter cette erreur🎜🎜Cela permet non seulement à la fonction invokeAnything() d'accepter n'importe quel nombre. type de paramètres, mais aussi forces Comment effectuer une vérification de type sur ce paramètre pour éviter l'erreur ci-dessus ? 🎜🎜Frère inconnu est invité à contrôler le terrain. 🎜🎜Comme any, la variable inconnu accepte n'importe quelle valeur. Mais TypeScript applique la vérification de type lorsque vous essayez d'utiliser des variables inconnues. N'est-ce pas ce que nous voulons ? 🎜rrreee🎜Parce que le type du paramètre callback est inconnu, l'instruction callback() a une erreur de type : Object is of tapez 'inconnu'. Contrairement à any, TypeScript nous protège d'appeler quelque chose qui pourrait ne pas être une fonction. 🎜🎜Avant d'utiliser une variable de type inconnu, vous devez effectuer une vérification de type. Dans cet exemple, il suffit de vérifier si callback est un type de fonction. 🎜rrreee

2. Modèles mentaux d'inconnu et de tout

🎜Pour être honnête, quand j'apprenais, il m'était difficile de comprendre inconnu. En quoi est-ce différent de any puisque les deux types acceptent n'importe quelle valeur 🎜🎜Voici les règles qui m'ont aidé à comprendre la différence entre les deux : 🎜
  • Tout peut être attribué à types inconnus, mais aucune opération ne peut être effectuée sur inconnu sans vérification de type ou assertion de type
  • Tout peut être assigné à n'importe quel
  • code> type, vous pouvez également effectuer n'importe quelle opération sur le type n'importe quel
🎜L'exemple ci-dessus illustre simplement la similitude entre inconnu et `tout différent. 🎜🎜inconnu Exemple : 🎜rrreee🎜Type check typeof callback === 'function', vérifiez si callback est une fonction, si c'est le cas, alors Peut être appelé. 🎜🎜any Exemple : 🎜rrreee🎜Si callback est any, TypeScript ne forcera pas l'instruction callback() Effectuez des vérifications de type. 🎜

3. Résumé

🎜unknown et any sont 2 types spéciaux qui peuvent contenir n'importe quelle valeur. 🎜🎜Il est recommandé d'utiliser inconnu au lieu de any car il fournit un type plus sûr - si vous souhaitez opérer sur inconnu, vous devez utiliser le type Assert ou restreint à un type spécifique. 🎜🎜Pour plus de connaissances sur la programmation, veuillez visiter : 🎜Vidéos de programmation🎜 ! ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer