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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

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

一、聯(lián)合類型

在TypeScript中,聯(lián)合類型(Union Types)是指用“|”符號(hào)將多個(gè)類型組合成一個(gè)的類型。這種類型可以包含不同的類型,例如字符串、數(shù)字或?qū)ο?/strong>。這些不同類型的值可以賦值給聯(lián)合類型的變量。而在使用這個(gè)變量時(shí),需要對(duì)不同類型的值進(jìn)行類型檢查,以確定當(dāng)前變量的類型。

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

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

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

  • 當(dāng)賦值為字符串時(shí),可以調(diào)用 length 屬性;
  • 當(dāng)賦值為數(shù)字時(shí),就無法調(diào)用 length 屬性,會(huì)導(dǎo)致編譯報(bào)錯(cuò)。

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

二、類型別名

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

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

type MyType = string;

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

let myStr: MyType = "Hello, world";

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

類型別名也可以用來定義更復(fù)雜的類型。例如,我們可以把一個(gè)對(duì)象類型定義為類型別名:

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

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

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

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

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

三、接口

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

下面是一些關(guān)于TypeScript接口的詳細(xì)介紹:

  1. 對(duì)象接口

對(duì)象接口是在TypeScript中最常用的接口之一,它用于描述對(duì)象的結(jié)構(gòu)。它可以定義對(duì)象應(yīng)該有哪些屬性,它們的類型是什么,以及它們是否是可選的。例如:

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

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

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

  1. 函數(shù)接口

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

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

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

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

  1. 可索引類型接口

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

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

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

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

  1. 類接口

類接口描述一個(gè)類的實(shí)例結(jié)構(gòu)。它可以描述一個(gè)類中必須實(shí)現(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`);
  }
}

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

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

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

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

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

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

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

interface Person {
  name: string;
}

interface Person {
  age: number;
}

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

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

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

type Person = {
  name: string;
};

type Person = {
  age: number;
};

在上面的示例中,我們嘗試定義了兩個(gè)同名的類型別名Person,但是這會(huì)引起編譯錯(cuò)誤。因?yàn)轭愋蛣e名只能被定義一次。如果我們需要添加新的屬性,就需要重新定義一個(gè)新的類型別名,而不是擴(kuò)展已有的類型別名。

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

五、類型斷言

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

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

  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;
    

類型斷言有以下幾個(gè)特點(diǎn)

  • 它不會(huì)在運(yùn)行時(shí)進(jìn)行類型檢查或類型轉(zhuǎn)換,僅僅在編譯時(shí)發(fā)揮作用
  • 如果類型斷言的類型與變量實(shí)際的類型不同,則會(huì)導(dǎo)致編譯錯(cuò)誤
  • 類型斷言可以應(yīng)用于任何類型,包括原始類型、對(duì)象類型、函數(shù)類型等

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

  • 上一篇:沒有了
  • 下一篇:沒有了