1. 程式人生 > 其它 >php中explode的是什麼型別的_從兩個角度理解 TypeScript 中的型別是什麼?

php中explode的是什麼型別的_從兩個角度理解 TypeScript 中的型別是什麼?

技術標籤:php中explode的是什麼型別的

作者:Dr. Axel Rauschmayer
翻譯:瘋狂的技術宅
原文: https:// 2ality.com/2020/02/unde rstanding-types-typescript.html 未經允許嚴禁轉載

TypeScript中的型別是什麼?本文中描述了兩種有助於理解它們的觀點。

每個角度三個問題

以下三個問題對於理解型別如何工作非常重要,並且需要從兩個角度分別回答。

  1. myVariable 具有 MyType 型別是什麼意思?
let myVariable: MyType = /*...*/;
  1. SourceType 是否可以分配給 TargetType
let source: SourceType = /*...*/;
   let target: TargetType = source;
  1. TypeUnion 是如何從 Type1Type2Type3 派生的?
type TypeUnion = Type1 | Type2 | Type3;

觀點1:型別是值的集合

從這個角度來看,型別是一組值:

  1. 如果 myVariable 的型別為 MyType,則意味著所有可以分配給 myVariable 的值都必須是 MyType 集合的元素。
  2. SourceType 可分配給 TargetTypeSourceTypeTargetType
    的子集。結果所有能被 SourceType 接受的值也被 TargetType 接受。
  3. 型別 Type1Type2Type3 的型別聯合是定義它們集合的集合理論 union。

觀點2:型別相容性關係

從這個角度來看,我們不關心值本身以及在執行程式碼時它們是如何流動的。相反,我們採取了更加靜態的觀點:

  • 原始碼中包含 location,每個 location 都有一個靜態型別。在支援 TypeScript 的編輯器中,如果將游標懸停在 location 上方,則可以看到該 location 的靜態型別。
  • 當源 location 通過分配、函式呼叫等連線到目標 location 時,則源 location 的型別必須與目標 location 的型別相容。 TypeScript 規範通過所謂的型別關係
    定義型別相容性。
  • ref="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3114-assignment-compatibility">型別關係分配相容性定義什麼時候把源型別 S 分配給目標型別 T
  • ST 是相同的型別。
  • STany 型別。

讓我們考慮以下問題:

  1. 如果將 myVariable 的靜態型別分配給 MyType,則 myVariable 的型別為 MyType
  2. 如果 SourceType 是相容分配的,則可以將它們分配給 TargetType
  3. 通過ref="https://github.com/microsoft/TypeScript/blob/master/doc/spec.md#3111-apparent-members">型別關係apparent 成員定義型別 union 的工作方式。

TypeScript 型別系統的一個有趣特徵是,同一變數在不同位置可以具有不同的靜態型別:

const arr = [];
// %inferred-type: any[]
arr;

arr.push(123);
// %inferred-type: number[]
arr;

arr.push('abc');
// %inferred-type: (string | number)[]
arr;

名義型別系統與結構型別系統

靜態型別系統的職責之一是確定兩種靜態型別是否相容:

  • 實際引數的靜態型別 U(例如,通過函式呼叫提供)
  • 對應形式引數的靜態型別 T(在函式定義中指定)

這通常意味著檢查 U 是否為 T 的子型別。大致有兩種檢查方法:

  • 名義型別系統中,兩個靜態型別如果具有相同的標識(“名稱”)則相等。如果明確聲明瞭它們的子型別關係,則一種型別是另一種型別的子型別。
  • 名義型別的語言為 C ++、Java、C#、Swift 和 Rust。
  • 結構型別系統中,兩個靜態型別具有相同的結構(如果它們具有相同的名稱和相同的型別)則相等。如果 U 具有 T 的所有部分(可能還有其他),並且 U 的每個部分具有 T 的相應部分的子型別,則型別 U 是另一種型別 T 的子型別。
  • 具有結構化型別的語言為 OCaml/ReasonML、Haskell 和 TypeScript。

以下程式碼在名義型別系統中會產生型別錯誤(A 行),但在 TypeScript 的結構型別系統中是合法的,因為類 A 和類 B 具有相同的結構:

class A {
  name = 'A';
}
class B {
  name = 'B';
}
const someVariable: A = new B(); // (A)

TypeScript 的 interface 在結構上也可以正常工作 —— 不必為了匹配而實現它們:

interface Point {
  x: number;
  y: number;
}
const point: Point = {x: 1, y: 2}; // OK

進一步閱讀

Type Compatibility​www.typescriptlang.org TypeScript 規範中的 “TypeRelationships” 部分​github.com

歡迎關注前端公眾號:前端先鋒,獲取更多前端乾貨。

5634bfd91768d1494508a62d1409fff7.png