国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Typescript - 通俗易懂的 interface 接口,創(chuàng)建接口 / 基礎使用 / 可選屬性 / 只讀屬性 / 任意屬性(詳細教程)

這篇具有很好參考價值的文章主要介紹了Typescript - 通俗易懂的 interface 接口,創(chuàng)建接口 / 基礎使用 / 可選屬性 / 只讀屬性 / 任意屬性(詳細教程)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在面向?qū)ο笳Z言中,接口是一個很重要的概念,它是對行為的抽象,而具體如何行動需要由類去實現(xiàn)。

TypeScript 中的接口是一個非常靈活的概念,除了可用于 對類的一部分行為進行抽象 以外,也常用于對「對象的形狀(Shape)」進行描述。

?TypeScript 的核心原則之一是對值所具有的結構進行類型檢查,并且只要兩個對象的結構一致,屬性和方法的類型一致,則它們的類型就是一致的。? 在TypeScript里,接口的作用就是為這些類型命名和為代碼或第三方代碼定義契約。

簡單點說,在 TypeScript中,接口是一個很重要的特性,它讓 TypeScript 具備了 JavaScript 所缺少的、描述較為復雜數(shù)據(jù)結構的能力。

引入主題

其實在 JavaScript 日常開發(fā)中,很多時候都需要接口來 “規(guī)范” 程序。

假設在 JavaScript 中定義一個函數(shù),用來獲取一個用戶的姓名和年齡的字符串:

function getUserInfo(user) {
    return `name: ${user.name}, age: ${user.age}`
}

函數(shù)調(diào)用:

getUserInfo({name: "koala", age: 18})

您可能會問,我們寫 JavaScript 的時候,這個再正常不過了吧?

但請注意,如果這個 getUserInfo() 在多人開發(fā)過程中,如果它是個公共函數(shù)(多個開發(fā)者都會調(diào)用),如果不是每個人點進來看函數(shù)對應注釋,可能會出現(xiàn)以下錯誤的調(diào)用:

// 1: 直接調(diào)用,不知道還需要傳參數(shù)
getUserInfo() // Uncaught TypeError: Cannot read property 'name' of undefined

// 2: 只傳遞一個參數(shù),不知道還有其他參數(shù)
console.log(getUserInfo({name: "王佳斌"})) // name: 王佳斌, age: undefined

// 3: 參數(shù)知道傳遞多少個,但不知鍵名
getUserInfo({name: "王佳斌", width: 560}) // name: 王佳斌, age: undefined

// ...

由于 JavaScript 是弱類型的語言,所以 并不會對我們傳入的代碼進行任何的檢測,

?? 有些錯你自己都說不清楚,但是就出了問題。


那么如何解決呢?有請 Typescript 接口登場。

創(chuàng)建接口

指定的接口名稱,最好與普通變量名 “有所區(qū)分” ,比如接口名首字母大寫、首字母前綴(In_xxx)等。

在 Typescript 中,使用 interface 關鍵字來定義一個接口,其中 name 就是接口名稱。

interface name {}

基礎使用

Typescript 接口可以規(guī)定函數(shù)的 “形狀”,也可以規(guī)定變量的 “形狀”,下面有兩個示例。

以下 JavaScript 例子(前面已經(jīng)提到了,忘記的話往前翻):

function getUserInfo(user) {
    return `name: ${user.name}, age: ${user.age}`
}

這個所存在的問題大家已經(jīng)知道了,下面用 Typescript 接口進行函數(shù)重構。

// 規(guī)定"形狀"
interface Info {
  name: string;
  age: number;
}

// 函數(shù)(冒號后跟上 "接口名")
function getUserInfo({ name, age }: Info) {
    return `name: ${name}, age: ${age}`
}

// 正常都傳遞
console.log(getUserInfo({ name: '王佳斌', age: 123 }))
// 結果OK:"name: 王佳斌, age: 123" 

// 少傳遞一個
console.log(getUserInfo({ name: '王佳斌' }))
// Property 'age' is missing in type '{ name: string; }' but required in type 'Info'.
// 類型“{name:string;}”中缺少屬性“age”,但類型“Info”中需要該屬性。

// 都不傳遞
console.log(getUserInfo())
// Expected 1 arguments, but got 0.
// 應為1個參數(shù),但得到了0個。

你看,這些都是在編寫代碼時 TypeScript 提示的錯誤信息,這樣就避免了在使用函數(shù)的時候傳入不正確的參數(shù)。

注意:在定義接口時,不要把它理解為是在定義一個對象,{} 括號包裹的是一個代碼塊,里面是聲明語句,只不過聲明的不是變量的值而是類型。聲明也不用等號賦值,而是冒號指定類型。每條聲明之前用換行分隔即可,也可以使用分號或者逗號。


另外,接口還可以被變量所使用(繼承接口的 “形狀”),如下代碼所示:

// 規(guī)定"形狀"
interface Info {
  name: string;
  age: number;
}

// 變量 "繼承" 接口
const student: Info = {
  name: '小王',
  age: 15
}

// 測試變量
console.log(student)//{"name": "小王", "age": 15}

// 錯誤用法(比如寫一個 "Info" 接口不存在的參數(shù))
const err: Info = {
  a: 1
}
// Object literal may only specify known properties, and 'a' does not exist in type 'Info'.
// 對象文字只能指定已知的財產(chǎn),類型“Info”中不存在“a”。

可選屬性

當然,TypeScript 中也允許不 “必傳” 某些參數(shù),有這個字段就做處理,沒有就忽略。

如下代碼所示,message 參數(shù)可以不傳遞。

// 使用 "?" 表示此參數(shù)非必傳
interface Log {
  message?: string;
}

// 函數(shù)
function print({ message }: Log) {
  console.log(message || '該參數(shù)沒有傳遞~')
}

// 傳遞參數(shù)
print({ message: 'hello' }) //"hello" 

// 不傳遞
print({}) //"該參數(shù)沒有傳遞~" 

很好理解。

只讀屬性

TypeScript 支持將某些參數(shù)設置為 “只讀”,用于限制只能在對象剛剛創(chuàng)建的時候修改其值,后續(xù)無法再修改。

如下代碼所示,age 參數(shù)不可后期修改。

// 使用 "readonly" 關鍵字表示此參數(shù)"只讀"
interface Info {
  name: string;
  readonly age: number;
}

// 創(chuàng)建變量("age"只能初始的時候賦值一次)
const student: Info = {
  name: '小王',
  age: 15
}

// 測試修改只讀屬性 "age"
student.age = 50
// Cannot assign to 'age' because it is a read-only property.
// 無法分配給“age”,因為它是只讀屬性。

此外 TypeScript 還提供了 ReadonlyArray<T> 類型,它與 Array<T> 相似,只是把所有可變方法去掉了,因此可以確保數(shù)組創(chuàng)建后再也不能被修改。

// 創(chuàng)建一個 "絕對不可修改" 的數(shù)組(number類型)
let arr: ReadonlyArray<number> = [1, 2, 3, 4]

// 測試賦值
arr[0] = 10
// Index signature in type 'readonly number[]' only permits reading.
// 類型為“只讀數(shù)字[]”的索引簽名只允許讀取。

// 測試添加數(shù)組項
arr.push(5)
// Property 'push' does not exist on type 'readonly number[]'.
// 類型“只讀數(shù)字[]”上不存在屬性“push”。

// 測試賦值數(shù)組長度
arr.length = 99
// Cannot assign to 'length' because it is a read-only property.
// 無法分配給“l(fā)ength”,因為它是只讀屬性。

任意屬性

有時候我們希望一個接口中除了包含必選和可選屬性之外,還允許有其他的任意屬性,這時我們可以使用 索引簽名 的形式來滿足上述要求。

如下代碼所示,除了 name 必傳外,后面你可以隨意傳遞參數(shù)。

// 使用 "[propName: string]: any" 支持任意類型
interface Person {
  name: string;
  [propName: string]: any;
}

// 只傳遞必填,其他參數(shù)不要
const a: Person = { name: '小王' }
console.log(a) //{"name": "小王"}

// 傳遞必填,其他參數(shù)隨意傳遞
const b: Person = { name: '小王', age: 15, sex: '男' }
console.log(b) //{"name": "小王", "age": 15, "sex": "男"}

很好理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-413893.html

到了這里,關于Typescript - 通俗易懂的 interface 接口,創(chuàng)建接口 / 基礎使用 / 可選屬性 / 只讀屬性 / 任意屬性(詳細教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • TypeScript--接口interface的定義,實現(xiàn),繼承

    TypeScript--接口interface的定義,實現(xiàn),繼承

    可瀏覽博客主頁的 TypeScript 專欄,會陸續(xù)添加相關文章,有問題或者可以優(yōu)化的地方也希望大大門告知 共同進步 :) ts版本 Version 4.8.4 TypeScript的核心原則之一是對值所具有的結構進行類型檢查。 它有時被稱做“鴨式辨型法”或“結構性子類型化”。 在TypeScript里,接口的作

    2023年04月12日
    瀏覽(31)
  • 【TypeScript】TS接口interface類型(三)

    【TypeScript】TS接口interface類型(三)

    一、前言 TypeScript的核心原則之一是對值所具有的結構進行類型檢查。 它有時被稱做“鴨式辨型法”或“結構性子類型化”。 在TypeScript里,接口的作用就是為這些類型命名和為你的代碼或第三方代碼定義契約。這些方法都應該是抽象的,需要由具體的類去實現(xiàn),然后第三方

    2024年02月14日
    瀏覽(33)
  • 通俗易懂聲學基礎

    通俗易懂聲學基礎

    聲音是由振動產(chǎn)生的,當物體振動時,會引起周圍空氣的波動,導致空氣粒子間的距離發(fā)生疏密的變化,從而引發(fā)空氣壓強的變化,這種變化會傳到人的耳膜,再傳到人的大腦,人就聽到聲音了。 物理上,聲音有四個基本特性:音色、音強、音高、音長。其中音色為音段特征

    2023年04月24日
    瀏覽(18)
  • Docker零基礎快速入門(通俗易懂)

    Docker零基礎快速入門(通俗易懂)

    「作者主頁」: 士別三日wyx 「作者簡介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡安全領域優(yōu)質(zhì)創(chuàng)作者 Docker是Go語言開發(fā)的應用容器引擎,用來解決環(huán)境遷移問題。 比如,我在開發(fā)環(huán)境寫完了代碼,打包成war包放到放到測試環(huán)境,由于兩個環(huán)境的JDK版本不一樣,

    2024年01月16日
    瀏覽(28)
  • Linux 基礎入門(學習筆記通俗易懂版)

    本文章是學習了Linux的學習記錄,著重記錄了我對于Linux各命令的用法與感悟, 歡迎各位大佬批評指正 記錄者:CYH-BI 記錄日期:2023年7月7日 本篇文章將使用 虛擬機并安裝centos 進行實操。關于虛擬機的安裝請看其他教程,篇幅過長,不一展示。 Linux簡介部分 Linux起初由Linus

    2024年02月08日
    瀏覽(24)
  • useVModel()的使用------通俗易懂

    用于父子組件共享數(shù)據(jù), 1、父組件有個flag(Boolean)屬性 2、將flag屬性傳遞給子組件,要實現(xiàn)雙向數(shù)據(jù)綁定 3、flag屬性在子組件發(fā)生變化,父組件的flag屬性一起改變 父組件app.vue 1、父組件有flag屬性,使得flag和子組件uniInput雙向綁定 2、使用v-model:flag進行雙向綁定,v-model的默

    2024年01月15日
    瀏覽(25)
  • 用通俗易懂的方式講解:Stable Diffusion WebUI 從零基礎到入門

    用通俗易懂的方式講解:Stable Diffusion WebUI 從零基礎到入門

    本文主要介紹 Stable Diffusion WebUI 的實際操作方法,涵蓋prompt推導、lora模型、vae模型和controlNet應用等內(nèi)容,并給出了可操作的文生圖、圖生圖實戰(zhàn)示例。適合對Stable Diffusion感興趣,但又對Stable Diffusion WebUI使用感到困惑的同學。 前面分享了兩篇文章:十分鐘讀懂 Stable Diffusio

    2024年01月17日
    瀏覽(29)
  • 通俗易懂讀寫鎖ReentrantReadWriteLock的使用

    通俗易懂讀寫鎖ReentrantReadWriteLock的使用

    ReentrantReadWriteLock不知道大家熟悉嗎?其實在實際的項目中用的比較少,反正我所在的項目沒有用到過。 ReentrantReadWriteLock稱為讀寫鎖,它提供一個讀鎖,支持多個線程共享同一把鎖。它也提供了一把寫鎖,是獨占鎖,和其他讀鎖或者寫鎖互斥,表明只有一個線程能持有鎖資源

    2024年02月06日
    瀏覽(22)
  • c++ 對類與對象的基礎框架+完整思維導圖+基本練習題+深入細節(jié)+通俗易懂建議收藏

    c++ 對類與對象的基礎框架+完整思維導圖+基本練習題+深入細節(jié)+通俗易懂建議收藏

    上一章,我們將c++入門的基礎知識進行了學習,本章其實才算真正的跨入到c++開始可能比較難,但只有我們唯有不斷的前進,才能斬斷荊棘越過人生的坎坷! ???????? ? 話不多說安全帶系好,發(fā)車啦 (建議電腦觀看) 。 ? ? 附:紅色,部分為重點部分;藍顏色為需要記

    2024年02月01日
    瀏覽(21)
  • python類(class)的定義、使用、繼承、應用的通俗易懂理解

    1.為什么使用類 ????????一個類(class)可以包囊眾多函數(shù),所以一般使用類的情況下,都需要用到眾多有共性的函數(shù),把這些可能會一起調(diào)用的函數(shù)或者需要接連調(diào)用的函數(shù)歸為一個類,這樣需要使用的時候可以輕易的找到。 ????????在處理不同細節(jié)時使用的類區(qū)別

    2024年02月22日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包