1. 程式人生 > 程式設計 >TypeScript中正確使用interface和type的方法例項

TypeScript中正確使用interface和type的方法例項

目錄
  • 前言
  • interface
  • type
  • 附:interface和type不同點
  • 總結

前言

interface 和 typewww.cppcns.com 都是用來定義型別,可以理解定義 shape ,那麼 shape 表示一種設www.cppcns.com計大框,或者說只要具有某些特徵或者行為就是為一類事物。在有些面向例如 語言中,interface 用於定義行為,如果一個類實現了某一個 interface 表示該類具有某種行為或者說具有某種能力,例如writable 或者 readable 。可以通過行為來對事物進行劃分。interface 在 語言中應用風生水起,但是在 TypeScript interface 更偏於一種型別 shape,同時 TypeScript 也提供了 type 用於定義型別,其實 interface 和 type 在 TypeScript 中區別不大,但是還是有點區別。

interface

interface 可以用於對類(clwww.cppcns.comass)、物件(object)或者函式(function)進行 shape。

interface Tut{
    title:string
    isComplete:boolean
}

定義了一個介面 interface 用於表示 Tut 型別,然後定義型別 Tut 的變數 machineLearningTut

const machineLearningTut:Tut = {
    title:"machine learning basic",isComplete:true
}

如果型別為 Tut 的 machineLearningTut 沒有完全實現介面介面定義屬性或者方法就會在編譯階段給出友好的提示

const machineLearningTut:Tut = {
    title:"machine learning basic",}

提示型別 Tut 的 machineLearningTut 沒有實現 isComplete 這個在介面中已經宣告的屬性。

Property 'isComplete' is missing in type '{ title: string; }' but required in type 'Tut'.ts(2741)

[demo2.ts(3,5):]()'isComplete' is declared here.
blqIouwIJy
class VideoTut implements Tut{
    title:string;
    isComplete:boolean;
}

也可以定義類 VideoTut 實現 Tut 介面

interface Greet{
    (name:string):string
}

const greet:Greet = (name)=> `hello ${name}`

也可以定義 Greet 介面用於 shape 函式,定義函式的引數和函式返回值型別

interface AdvanceTut extends Tut{
    isFree:boolean
}

const machineLearningTut:AdvanceTut = {
    title:"machine learning basic",isComplete:true,   isFree:true
}

介面間是可以通過 extend 來實現介面間的繼承(擴充套件),AdvanceTut 是對 Tut 的擴充套件,在 type 不支援 extend 來實現 type 間的擴充套件。

interface Tut{
    title:string
    isComplete:boolean
}

interface  Tut{
    isFree:boolean
}

const machineLearningTut:Tut = {
    title:"machine learning basic",isFree:true
}

上面連續聲明瞭兩個 Tut 同名 inteface 這兩 Tut 顯示是擴充套件的關係,並不是覆蓋的關係,這一點也是 type 也是不具備的特點

type

其實 type 用法和 interface 用法大同小異,不過 type 便於型別,可以是 基礎型別的別名。其實 type 從本質還是和 interface 還是有些區別,這個可能即使解釋了還需要大家在實踐過程慢慢體會。

type isComplete = boolean
type title = string
type greet = (name:string)=>string

type Tut = {
    title:string;
    isComplete:boolean
}

const machineLearningTut:Tut = {
    title:"machine learning title",isComplete:true
}

type Tut = {
    title:string;
    isComplete:boolean
} & {
    isFree:boolean
}

const machineLearningTut:Tut = {
    title:"machine learning title",isFree:true
}

type 型別可以 & 實現對 type 的擴充套件

type VideoTut = Tut | {
    isFree:boolean
}

const machineLearningTut:VideoTut = {
    title:"machine learning title",isFree:true
}
export type InputProps = {
    type:'text'|'email';
    value:string;
    onChane:(newValue:string)=>void
}

而且前後端定義型別也可以用 type 來實現,如下可以定義多個基本型別,這些定義好的型別可以定義新的型別。

type onChaneType = (newValue:string)=>void

type InputType = 'text'|'email';

type InputValue = string

export type InputProps = {
    type:InputType;
    value:InputValue;
    onChane:onChaneType
}

附:interface和type不同點

type可以宣告基本類型別名、聯合型別、元祖等型別

// 基本類型別名
type Name = string;

// 聯合型別
interface Dog {
    wong()
}
interface Cat {
    miao();
}

type Pet = Dog | Cat;

// 具體定義陣列每個位置的型別
type PetList = [Dog,Pet];

type語句中還可以使用typeof獲取例項的型別進行賦值

// 當你想要獲取一個變數的型別時,使用typeof
let div = document.createElement('div');
type B = typeof div;

type其他騷操作

type StringOrNumber = string | number;
type Text = string | { text: string };
type NameLookup = Dictionary<string,Person>;
type Callback<T> = (data: T) => void;
type Pair<T> = [T,T];
type Coordinates = Pair<number>;
type Tree<T> = T | { left: Tree<T>,right: Tree<T> };

interface能夠宣告合併

interface User {
    name: string;
    age: number;
}

interface User {
    sex: string;
}

User介面為:

{
    name: string;
    age: number;
    sex: string;
}


總結

到此這篇關於TypeScript中正確使用interface和type的文章就介紹到這了,更多相關TypeScript使用interface和type內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!