聯(lián)合類型(Union Types)表示取值可以為多種類型中的一種,只能是其中的一種着茸。
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
訪問聯(lián)合類型的屬性或方法
當 TypeScript 不確定一個聯(lián)合類型的變量到底是哪個類型的時候,我們只能訪問此聯(lián)合類型的所有類型里共有的屬性或方法:
function getLength(something: string | number): number {
return something.length;
}
// index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
function getLength(something: string | number): number {
return something.toString();
}
類型別名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
if (typeof n === 'string') {
return n;
} else {
return n();
}
}
字符串字面量類型
字符串字面量類型用來約束取值只能是某幾個字符串中的一個匿情。
type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames) {
// do something
}
handleEvent(document.getElementById('hello'), 'scroll'); // 沒問題
handleEvent(document.getElementById('world'), 'dblclick'); // 報錯扭倾,event 不能為 'dblclick'
// 數(shù)字也可以
type Nums = 1 | 2 | 3;
接口
在 TypeScript 中,我們使用接口(Interfaces)來定義對象的類型漾唉。
在面向?qū)ο笳Z言中荧库,接口(Interfaces)是一個很重要的概念,它是對行為的抽象毡证,而具體如何行動需要由類(classes)去實現(xiàn)(implement)电爹。
TypeScript 中的接口是一個非常靈活的概念,除了可用于對類的一部分行為進行抽象以外料睛,也常用于對「對象的形狀(Shape)」進行描述丐箩。
常見:
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
};
接口一般首字母大寫,定義的變量比接口少了一些屬性是不允許的恤煞,多一些屬性也是不允許的屎勘,賦值的時候,變量的形狀必須和接口的形狀保持一致居扒。
可選屬性
此時用可用可選屬性
interface Person {
name: string;
age?: number;
}
此時age參數(shù)可選概漱,但是仍然不允許添加未定義的屬性。
任意屬性
還可設(shè)置任意屬性如下方式:
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
需要注意的是喜喂,一旦定義了任意屬性瓤摧,那么確定屬性和可選屬性的類型都必須是它的類型的子集:
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
此時可選的age只能是string類型,[propName: string]: 可使用聯(lián)合聲明或者any玉吁。
一個接口中只能定義一個任意屬性
只讀屬性
有時候我們希望對象中的一些字段只能在創(chuàng)建的時候被賦值照弥,那么可以用 readonly 定義只讀屬性:
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 89757,
name: 'Tom',
gender: 'male'
};
tom.id = 9527;
注意,只讀的約束存在于第一次給對象賦值的時候进副,而不是第一次給只讀屬性賦值的時候