Heim  >  Artikel  >  Web-Frontend  >  Lassen Sie uns über den Unterschied zwischen „unknown“ und „any“ in TypeScript sprechen

Lassen Sie uns über den Unterschied zwischen „unknown“ und „any“ in TypeScript sprechen

青灯夜游
青灯夜游nach vorne
2021-10-27 11:14:492150Durchsuche

Dieser Artikel wird Ihnen helfen, „unknown“ und „any“ in TypeScript zu vergleichen und über die Unterschiede zwischen „unknown“ und „any“ zu sprechen. Ich hoffe, er wird Ihnen hilfreich sein!

Lassen Sie uns über den Unterschied zwischen „unknown“ und „any“ in TypeScript sprechen

Wir wissen, dass Variablen vom Typ any jedem beliebigen Wert zugewiesen werden können. 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 Der Leitfaden empfiehlt nicht die Verwendung von any, da durch dessen Verwendung Typbeschränkungen verloren gehen – und die Notwendigkeit von Typbeschränkungen ist auch einer der Gründe, warum wir Wählen Sie TypeScript, also geht es ein bisschen in die entgegengesetzte Richtung.

TypeScript (Version 3.0 und höher) bietet auch einen speziellen Typ unknown ähnlich wie any. Wir können der Variablen vom Typ unknown auch einen beliebigen Wert zuweisen: rrreee

Nun stellt sich die Frage, was der Unterschied zwischen any und unknown ist ? 🎜

1. Unknown vs. Any

🎜Um den Unterschied zwischen unknown und any besser zu verstehen, beginnen wir zunächst indem Sie eine Funktion schreiben, deren einziges Argument Sie aufrufen möchten. 🎜🎜Wir setzen den einzigen Parameter von invokeAnything() auf den Typ any. 🎜rrreee🎜Da der Parameter callback von einem beliebigen Typ ist, ist der Die Anweisung callback() löst keinen Typfehler aus. Mit Variablen vom Typ any können wir alles machen. 🎜🎜Aber beim Ausführen wird ein Laufzeitfehler ausgegeben: TypeError: callback is not a function. 1 ist eine Zahl und kann nicht als Funktion aufgerufen werden. TypeScript schützt den Code nicht, um diesen Fehler zu vermeiden. Dadurch kann die Funktion invokeAnything() nicht nur beliebige Zahlen akzeptieren Typ von Parametern, sondern auch Kräfte. Wie führe ich eine Typprüfung für diesen Parameter durch, um den oben genannten Fehler zu verhindern? 🎜🎜Bruder unbekannt ist eingeladen, das Feld zu kontrollieren. 🎜🎜Wie any akzeptiert die Variable unknown jeden Wert. TypeScript erzwingt jedoch eine Typprüfung, wenn versucht wird, unbekannte-Variablen zu verwenden. Ist das nicht das, was wir wollen? 🎜rrreee🎜Da der Typ des callback-Parameters unbekannt ist, weist die Anweisung callback() einen Typfehler auf: Object is of Geben Sie „unbekannt“ ein. Im Gegensatz zu any schützt uns TypeScript davor, etwas aufzurufen, das möglicherweise keine Funktion ist. 🎜🎜Bevor Sie eine Variable vom Typ unknown verwenden, müssen Sie eine Typprüfung durchführen. In diesem Beispiel müssen wir nur prüfen, ob callback ein Funktionstyp ist. 🎜rrreee

2. Mentale Modelle von unbekanntem und beliebigem

🎜Um ehrlich zu sein, war es für mich schwierig, unknown zu verstehen. Wie unterscheidet es sich von any, da beide Typen jeden Wert akzeptieren 🎜🎜Hier sind die Regeln, die mir geholfen haben, den Unterschied zwischen den beiden zu verstehen: 🎜
  • Alles kann zugewiesen werden unbekannte-Typen, aber es können keine Operationen für unknown ohne Typprüfung oder Typzusicherung durchgeführt werden
  • Alles kann jedem
  • -Code> zugewiesen werden Typ können Sie auch jede Operation für den Typ any
ausführen. 🎜 Das obige Beispiel veranschaulicht lediglich die Ähnlichkeit zwischen unknown und „any different“. 🎜🎜unknown Beispiel: 🎜rrreee🎜Typprüfung typeof callback === 'function', prüfen, ob callback eine Funktion ist, wenn ja, dann Kann aufgerufen werden. 🎜🎜any Beispiel: 🎜rrreee🎜Wenn callback any ist, erzwingt TypeScript die Anweisung callback() nicht Führen Sie etwaige Typprüfungen durch. 🎜

3. Zusammenfassung

🎜unknown und any sind zwei spezielle Typen, die einen beliebigen Wert enthalten können. 🎜🎜Es wird empfohlen, unknown anstelle von any zu verwenden, da dies einen sichereren Typ bietet – wenn Sie mit unknown arbeiten möchten, müssen Sie verwenden den Typ Assert oder auf einen bestimmten Typ eingrenzen. 🎜🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Programmiervideos🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Unterschied zwischen „unknown“ und „any“ in TypeScript sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen