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

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

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

一文帶你了解中Typescript中type與interface的區(qū)別

作者:我的名字豌豆 更新時(shí)間: 2022-05-10 編程語(yǔ)言

?想繼續(xù)深入Ts其他知識(shí)點(diǎn)的同學(xué)可以關(guān)注下往期文章~
?? 一文帶你了解Ts泛型的應(yīng)用
?? 一文講解Typescript中工具類(lèi)型

?在我們Ts使用的日常開(kāi)發(fā)中,我們對(duì)于type(類(lèi)型別名)與interface(接口)的使用可能傻傻分不清楚,因?yàn)樗麄兊墓δ苓€是非常相似的,可以說(shuō)在大多數(shù)情況下type與interface還是等價(jià)的,我們可以使用兩種中的任意一種來(lái)對(duì)我們的項(xiàng)目進(jìn)行類(lèi)型定義,那么存在即合理,接下來(lái)我們將對(duì)type與interface有什么區(qū)別來(lái)進(jìn)行講解~

type與interface的相同點(diǎn)

定義對(duì)象或者函數(shù)的形狀

?首先兩者都可以對(duì)基本數(shù)據(jù)類(lèi)型與函數(shù)進(jìn)行類(lèi)型定義,比如:

	interface Test {
	    a: string;
	    b: number;
	    c: boolean;
	    d?: number; // 可選屬性
	    readonly e: string; //只讀屬性
	    [f: string]: any //任意屬性
	}
	
    interface TestFunc {
        (name:string,age:number): void
    }
    
    
	type Test = {
	    a: string;
	    b: number;
	    c: boolean;
	    d?: number; // 可選屬性
	    readonly e: string; //只讀屬性
	    [f: string]: any //任意屬性
	}
    type TestFunc = (name:string,age:number) => void
    

支持?jǐn)U展/繼承

?首先對(duì)于type與interface都是支持繼承的,但是兩者進(jìn)行繼承的方式不同,interface是通過(guò)extends來(lái)進(jìn)行繼承,而type是通過(guò)&來(lái)實(shí)現(xiàn),并且兩者可以進(jìn)行相互拓展,也就是interface可以拓展為type,type也可以拓展為interface。示例:

	// interface進(jìn)行拓展
	interface A {
    	a: string;
	}
	interface B extends A {
	    b: string;
	}
	
	let testObj: B = {
	    a: 's',
	    b: 's'
	}
	// type進(jìn)行拓展
	type A = {
	    a: string;
	}
	
	type Test2 = A & {
	    b: string;
	}
	
	let testObj: B = {
	    a: 'test',
	    b: 'test'
	}
	
	// interface拓展為type
	type A = {
	    a: string
	}
	
	interface B extends A {
	    b: string;
	}
	
	let testObj: B = {
	    a: 'test',
	    b: 'test'
	}
	// type拓展為interface
	interface A {
	    a: string;
	}
	
	type B = A & {
	    b: string;
	}
	
	let testObj: B = {
	    a: 'test',
	    b: 'test'
	}
	

type與interface的不同點(diǎn)

type的不同點(diǎn)

  • type可以定義基本類(lèi)型的別名,如 type anotherNumber = number,此時(shí)anotherNumber可以代表number類(lèi)型,也作為其number類(lèi)型的別名
	type C = number;
	
	let numberC: C = 2;
  • type可以通過(guò)typeof操作符來(lái)進(jìn)行定義,比如:type A = typeof B
	let num: number = 1;
	
	type C = typeof num;
  • type可以聲明聯(lián)合類(lèi)型,如 type unionA = B1 | B2
	type C = string | number | null;
	let a: C = '1';
	let b: C = 1;
	let c: C = null;
  • type可以聲明元組類(lèi)型,如 type tupleA = [B1, B2]
	type C = [string, number];
	
	const cArr: C = ['1', 1];

interface的不同點(diǎn)

  • interface可以被多次定義,并且被多次定義的interface會(huì)進(jìn)行類(lèi)型合并,而type不可以
	// interface進(jìn)行重復(fù)聲明
	interface A {
	    a: number;
	}
	interface A {
	    b: string;
	}
	// 此時(shí)類(lèi)型為{a:number,b:string}
	let testA: A = {
	    a: 1,
	    b: '1'
	}
	// 使用type進(jìn)行重復(fù)聲明類(lèi)型
	type B = {
	    a: number;
	}
	// error報(bào)錯(cuò),標(biāo)識(shí)符重復(fù)(重復(fù)定義了B類(lèi)型)
	type B = {
	    b: string;
	}

原文鏈接:https://blog.csdn.net/liu19721018/article/details/124533573

欄目分類(lèi)
最近更新