在 typescript 中,我們使用介面(inte***ces)來定義物件的型別。
在物件導向語言中,介面(inte***ces)是乙個很重要的概念,它是對行為的抽象,而具體如何行動需要由類(classes)去實現(implement)。
typescript 中的介面是乙個非常靈活的概念,除了可用於對類的一部分行為進行抽象以外,也常用於對「物件的形狀(shape)」進行描述。
inte***ce
person
let tom: person =
;
上面的例子中,我們定義了乙個介面person
,接著定義了乙個變數tom
,它的型別是person
。這樣,我們就約束了tom
的形狀必須和介面person
一致。
介面一般首字母大寫。有的程式語言中會建議介面的名稱加上i
字首。
定義的變數比介面少了一些屬性是不允許的:
inte***ce
person
let tom: person =
;// index.ts(6,5): error ts2322: type '' is not assignable to type 'person'.
// property 'age' is missing in type ''.
多一些屬性也是不允許的:
inte***ce
person
let tom: person =
;// index.ts(9,5): error ts2322: type '' is not assignable to type 'person'.
// object literal may only specify known properties, and 'gender' does not exist in type 'person'.
可見,賦值的時候,變數的形狀必須和介面的形狀保持一致。
有時我們希望不要完全匹配乙個形狀,那麼可以用可選屬性:
inte***ce
person
let tom: person =
;inte***ce
person
let tom: person =
;
可選屬性的含義是該屬性可以不存在。
這時仍然不允許新增未定義的屬性:
inte***ce
person
let tom: person =
;// examples/playground/index.ts(9,5): error ts2322: type '' is not assignable to type 'person'.
// object literal may only specify known properties, and 'gender' does not exist in type 'person'.
有時候我們希望乙個介面允許有任意的屬性,可以使用如下方式:
inte***ce
person
let tom: person =
;
使用[propname: string]
定義了任意屬性取string
型別的值。
需要注意的是,一旦定義了任意屬性,那麼確定屬性和可選屬性的型別都必須是它的型別的子集:
inte***ce
person
let tom: person =
;// index.ts(3,5): error ts2411: property 'age' of type 'number' is not assignable to string index type 'string'.
// index.ts(7,5): error ts2322: type '' is not assignable to type 'person'.
// index signatures are incompatible.
// type 'string | number' is not assignable to type 'string'.
// type 'number' is not assignable to type 'string'.
上例中,任意屬性的值允許是string
,但是可選屬性age
的值卻是number
,number
不是string
的子屬性,所以報錯了。
另外,在報錯資訊中可以看出,此時的型別被推斷成了
,這是聯合型別和介面的結合。
乙個介面中只能定義乙個任意屬性。如果介面中有多個型別的屬性,則可以在任意屬性中使用聯合型別:
inte***ce
person
let tom: person =
;
有時候我們希望物件中的一些字段只能在建立的時候被賦值,那麼可以用readonly
定義唯讀屬性:
inte***ce
person
let tom: person =
;tom.id =
9527
;// index.ts(14,5): error ts2540: cannot assign to 'id' because it is a constant or a read-only property.
上例中,使用readonly
定義的屬性id
初始化後,又被賦值了,所以報錯了。
注意,唯讀的約束存在於第一次給物件賦值的時候,而不是第一次給唯讀屬性賦值的時候:
inte***ce
person
let tom: person =
;tom.id =
89757
;// index.ts(8,5): error ts2322: type '' is not assignable to type 'person'.
// property 'id' is missing in type ''.
// index.ts(13,5): error ts2540: cannot assign to 'id' because it is a constant or a read-only property.
上例中,報錯資訊有兩處,第一處是在對tom
進行賦值的時候,沒有給id
賦值。
第二處是在給tom.id
賦值的時候,由於它是唯讀屬性,所以報錯了。
TypeScript中物件的型別限制 介面
物件的型別 介面 介面在ts中的作用之一 typescript 中的介面是乙個非常靈活的概念,除了可用於對類的一部分行為進行抽象以外,也常用於對物件的形狀進行描述。此篇主要學習對物件的形狀進行描述.inte ce person let tom person let merry person let ...
SAP CRM 使用者介面物件型別和設計物件
在crm中的使用者介面物件型別的幫助下,我們可以做這些工作 進行不同的檢視配置 建立動態導航 從設計層控制字段標籤 值幫助 控制bol物件的屬性的可視性 從導航欄訪問自定義元件 乙個使用者介面物件型別之下會有設計物件的集合,每個設計物件可以控制bol物件的屬性。第一步,建立乙個 類。前往事務se24...
物件導向的介面
物件導向的介面 dao模式 為解決業務 和資料訪問的緊耦合給修改和維護 帶來的不便,推薦適 應dao模式封裝jdbc dao模式組成部分 dao介面 dao實現類 實體類資料庫連線和封閉工具類 dao模式的優勢 隔離了資料訪問 和業務邏輯 隔離了不同資料庫實現 使用properties類讀取配置檔案...