日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

TypeScript中的聯(lián)合類型、類型別名、接口、類型斷言

作者:jieyucx 更新時間: 2023-07-26 編程語言

一、聯(lián)合類型

在TypeScript中,聯(lián)合類型(Union Types)是指用“|”符號將多個類型組合成一個的類型。這種類型可以包含不同的類型,例如字符串、數字或對象。這些不同類型的值可以賦值給聯(lián)合類型的變量。而在使用這個變量時,需要對不同類型的值進行類型檢查,以確定當前變量的類型。

以下是一個簡單的聯(lián)合類型的示例:

let myVar: string | number;
myVar = "hello";
console.log(myVar.length); // 輸出 5
myVar = 123;
console.log(myVar.length); // 報錯,類型“number”上不存在屬性“l(fā)ength”

在這個例子中,myVar 變量的類型是 string | number,可以賦值為一個字符串或者一個數字。

  • 當賦值為字符串時,可以調用 length 屬性;
  • 當賦值為數字時,就無法調用 length 屬性,會導致編譯報錯。

使用聯(lián)合類型可以增強代碼的靈活性,提高代碼的復用性和可維護性。在實際開發(fā)中,它也經常被用于函數參數的類型聲明、接口中的屬性類型聲明等方面。

二、類型別名

TypeScript中的類型別名是一種非常有用的功能,它可以讓我們給一種類型取一個自定義的名稱。這個名稱可以用來代替這種類型的任何地方,讓代碼更加簡潔易讀。

類型別名使用type關鍵字來創(chuàng)建,具體的語法如下:

type MyType = string;

這個語法在TypeScript中是很常見的,它把MyType這個名稱與string類型綁定在一起?,F(xiàn)在,我們可以用MyType來代替string類型了:

let myStr: MyType = "Hello, world";

這里的let語句聲明了一個變量myStr,它的類型是MyType,也就是string。我們可以看到,MyType已經被成功地解析成了string類型。

類型別名也可以用來定義更復雜的類型。例如,我們可以把一個對象類型定義為類型別名:

type Person = {
  name: string;
  age: number;
};

這里的Person類型別名代表了一個對象類型,它包含兩個屬性:nameage,分別是string類型和number類型。現(xiàn)在,我們可以用Person來定義一個對象:

let john: Person = {
  name: "John",
  age: 30
};

這里的john變量的類型就是Person,它是一個對象,帶有nameage兩個屬性。

總之,類型別名是TypeScript中非常實用的功能,在定義復雜類型、簡化代碼等方面都有很大的幫助。

三、接口

TypeScript中的接口是用來定義代碼之間交互的契約。它們可以用于描述對象、函數、類等的結構和規(guī)范。

下面是一些關于TypeScript接口的詳細介紹:

  1. 對象接口

對象接口是在TypeScript中最常用的接口之一,它用于描述對象的結構。它可以定義對象應該有哪些屬性,它們的類型是什么,以及它們是否是可選的。例如:

interface Person {
  name: string;
  age: number;
  email?: string;
}

const person: Person = {
  name: 'John',
  age: 25
}

在這個例子中,Person接口定義了一個人的結構,包括一個必填的“name”屬性,一個必填的“age”屬性和一個可選的“email”屬性。然后創(chuàng)建了一個名為“person”的對象,符合這個接口的定義。

  1. 函數接口

函數接口描述函數的形式參數和返回類型。例如:

interface Add {
  (x: number, y: number): number;
}

const add: Add = (x, y) => {
  return x + y;
};

在這個例子中,Add接口描述一個返回類型為number的函數,該函數接受兩個參數:x和y,這兩個參數均為number類型。

  1. 可索引類型接口

可索引類型接口用于描述可以像數組一樣使用的對象。它允許您定義一個對象,該對象通過整數或字符串屬性來訪問其元素。例如:

interface StringArray {
  [index: number]: string;
}

const myArray: StringArray = ['Hello', 'World'];

在這個例子中,StringArray接口允許我們通過數字來訪問數組中的元素,因此myArray[0]將返回字符串“Hello”。

  1. 類接口

類接口描述一個類的實例結構。它可以描述一個類中必須實現(xiàn)的屬性和方法。例如:

interface Animal {
  name: string;
  eat(food: string): void;
  sleep(hours: number): void;
}

class Cat implements Animal {
  name = 'Cat';
  eat(food: string) {
    console.log(`I'm eating ${food}`);
  }
  sleep(hours: number) {
    console.log(`I'm sleeping for ${hours} hours`);
  }
}

在這個例子中,Animal接口描述了一個動物實例應該具有的屬性和方法。Cat類實現(xiàn)了這個接口,因此它必須定義name,eat和sleep方法以滿足該接口。

總而言之,TypeScript接口提供了一種描述結構和規(guī)范的方式,從而使代碼更加清晰和易于理解。通過使用接口,開發(fā)人員可以定義約束,使得代碼更加穩(wěn)健、可靠和易于擴展。

四、類型別名和接口的區(qū)別

接口和類型別名的區(qū)別主要在以下幾個方面:

  1. 可以定義對象的形狀的只能是接口,類型別名不能。
interface Person {
  name: string;
  age: number;
}

type MyPerson = {
  name: string;
  age: number;
}
  1. 類型別名可以定義任意類型的別名,而不僅僅是對象類型。例如:
type MyBoolean = boolean;
type MyFunction = (...args: any[]) => any;
  1. 類型別名可以定義聯(lián)合類型、交叉類型、元組等復雜類型:
type MyType = string | number;
type MyObj = { a: string } & { b: number };
type MyTuple = [string, number];
  1. 接口可以定義擴展操作符(…)和可選屬性:
interface Foo {
  bar: string;
  baz?: number;
  [k: string]: any;   // 使用擴展操作符
}
  1. 接口可以定義函數:
interface MyFunc {
  (x: number, y: number): number;
}
  1. 接口可以被多次擴展,類型別名不能被擴展

接口可以被多次擴展,即一個接口可以在定義后被多次擴展,每次擴展都可以添加新的屬性或方法。比如下面的示例:

interface Person {
  name: string;
}

interface Person {
  age: number;
}

const person: Person = {
  name: "Tom",
  age: 18,
};

在上面的示例中,定義了一個名為Person的接口,并且在后面又定義了一個同名的接口。這是完全允許的,因為這兩個接口在類型聲明時是合并的。最終得到的Person接口將包含nameage兩個屬性。

相比之下,類型別名不能被擴展。例如:

type Person = {
  name: string;
};

type Person = {
  age: number;
};

在上面的示例中,我們嘗試定義了兩個同名的類型別名Person,但是這會引起編譯錯誤。因為類型別名只能被定義一次。如果我們需要添加新的屬性,就需要重新定義一個新的類型別名,而不是擴展已有的類型別名。

總的來說,接口更適合于描述對象的形狀和方法,而類型別名更適合于為復雜類型定義別名,或定義函數類型、聯(lián)合類型等。

五、類型斷言

TypeScript的類型斷言可以讓開發(fā)者手動指定一個變量的類型,即告訴編譯器當前變量的類型是什么,這個指定的類型可以與變量實際的類型不同

類型斷言可以在變量名前加上<type>或者使用as關鍵字,以下是兩種寫法的示例:

  1. <type>variable

    let someValue: any = "hello world";
    let strLength: number = (<string>someValue).length;
    
  2. variable as type

    let someValue: any = "hello world";
    let strLength: number = (someValue as string).length;
    

類型斷言有以下幾個特點

  • 它不會在運行時進行類型檢查或類型轉換,僅僅在編譯時發(fā)揮作用。
  • 如果類型斷言的類型與變量實際的類型不同,則會導致編譯錯誤
  • 類型斷言可以應用于任何類型,包括原始類型、對象類型、函數類型等。

原文鏈接:https://blog.csdn.net/jieyucx/article/details/131341689

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新