TypeScript筆記 - 數據類型

js 類型分爲兩種:基本數據類型和複雜數據類型

基本數據類型主要有:numberstringbooleannullundefinedsymbo(es6新增)、BigInt(es10新增)

ts 作爲 js 的超集,是依附 js 的,有着 js 的所有特性。ts 獨有的數據類型:anyvoidneverunknown、元組(Tuble)

接下來介紹一下 ts 的各種數據類型

 

any 表示任意類型

可以賦予任意類型的值。但這樣會逃避類型檢查,any類型的變量可以做任何操作,編輯時不會報錯

let name: any = 'Jane' // ok
let flag: any = true // ok
let age: any = 15 // ok

 

unknown 表示未知的類型

any的區別:unknown類型的值賦值給別的類型會報錯,any不會

let u: unknown = 'hello'
let a: any = 'hello'

let name: string
name = u // error:Type 'unknown' is not assignable to type 'string'
name = a // ok

 

number 表示數值類型

let num: number = 1

 

string 表示字符串類型

let str: string = 'Jane'

也可以使用es6 模板字符串

let name = 'Sasa'

let str: string = `my name is ${name}`

不能使用new String() 聲明字符串,會返回一個Object 

 

boolean 表示布爾值 true 和 false

let flag: boolean = true

不能使用new Boolean() 聲明布爾值,因爲會返回一個Object 

 

數組

  • 可以使用 類型 + [] 定義數組
let arr: number[] = [1, 2, 3]

以上代碼表示:數組內部所有值必須爲數值類型,否則就會報錯

let arr: number = [1, '2', 3] // error:Type '(string | number)[]' is not assignable to type 'number'.
  •  數組泛型定義數組
let arr: Array<number> = [1, 2, 3]
  • 接口定義數組 
interface ItemType {
    name: string;
    age: number
}

interface ListType {
    [index: number]: ItemType
}

let list: ListType = [{name: 'Sasa', age: 15}]

 

元組

表示 已知元素數量類型 的數組,長度需固定,對應位置的類型需要相同

下面定義一個 string number 的元組

let tupleList: [string, number]
tupleList = ['Jane', 16]

 

void

表示空,一般用於表示函數沒有返回值

// 表示該方法沒有返回值
function hello(): void{
    alert('hello world')
}

如果聲明一個void類型的變量,並沒有什麼用,因爲只能賦值undefinednull

let unusable: void = undefined;
// 或
let unusable: void = null;

 

null 和 undefined

和void類型,這兩個類型用處不大

let u: undefined = undefined
let n: null = null

默認情況下nullundefined是所有類型的子類型,就是說你可以把nullundefined賦值給其他類型的變量

但是爲了避免很多問題,可以在配置文件中指定strictNullChecks進行限制這種做法(嚴格空值檢查模式)

{
  "compilerOptions": {
     // ...
    "strictNullChecks": true
  }
}

 這樣在賦值的時候,會有提示:

let str: string = undefined //error:Type 'undefined' is not assignable to type 'string'.

 

never

表示那些不存在的值的類型,一般用於函數類類型聲明,表示永遠不會有返回值,比如函數拋出錯誤

function error(message: string): never {
    throw new Error(message);
}

 

枚舉

 

聯合類型

聯合是或的關係,類似if判斷裏面 ||,滿足其中一個即可

1、基礎類型聯合

let a: string | number
a = 1   // ok
a = '1' // ok

 2、對象類型聯合

interface Foo {
  foo: string;
  name: string;
}
 
interface Bar {
  bar: string;
  name: string;
}
 
const sayHello = (obj: Foo | Bar) => { /* ... */ }
 
sayHello({ foo: "foo", name: "lolo" })  // ok
sayHello({ bar: "bar", name: "growth" }) // ok

 

交叉類型

交叉是並集的關係,兩者合併到一起,類似if判斷 && 的關係,兩者都要達到要求

interface personType1 {
    name: string,
    age: number
}

interface personType2 {
    height: number
}

const person = (info: personType1 & personType2) => {
    console.log(info.name)   // Jane
    console.log(info.age)    // 16
    console.log(info.height) // 175
}
person({name: 'Jane', age: 16, height: 175})

 

類型推論

 初始化一個變量的時候,沒有定義類型,會按照類型推論規則,推斷出一個類型

注:如果定義的時候沒有賦值,不管之後有沒有賦值,都會被推斷成any類型,繼而後面不會被類型檢查

let name = 'Sasa'
name = 1 // error: Type '1' is not assignable to type 'string'.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章