TypeScript 基础之类型 (1)

980 阅读5分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

类型

基本类型

typescript 在JavaScript的语法基础上 支持对变量存储的类型进行限制

定义基本类型

  • string 和 number 和 boolean 和 symbol *String Number Boolean Symbol 是String,Number,Boolean,Symbol被定义的接口
let str: string = '字符串'
let num: number = 12
let bool: boolean = false
let sbl: symbol = Symbol()
  • null 和 undefined
    *默认情况下null和undefined是所有类型的子类型, 所有类型及时被限定了类型,也可以被赋值为 null 和 undefined。
let u: undefined = undefined
let n: null = null

复杂类型

  • 数组 Array
    *和js区别ts中的数组如果用这种方式 数组内部只能存放指定类型的数据。
    *可以使用any存放任何类型。
    *可以使用 | 指定多种类型。
let list: number[] = [1,2,3]
let list: Array<number> = [1, 2, 3]; // 接口范型
let list: (number|string)[] = [1,2,3,'123']
let list:[] = [1,2,'3'] // 错误,这是元组
  • Object 和 object
    *object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
    *object 可以是 Object 接口定义的类型, Object 可以是任意值。
    *Object是定义Object对象的接口,只能调用Object接口中包含的方法。
let obj: object = []
let obj: object = {}

其他

  • 元组
    *表示一个固定元素的数组。
let tuple: [number, number|string] = [1, 2]
tuple = [1, '2']
  • 枚举
    *枚举 本质上就是一个键值对对象,值默认从0开始,同时值也会作为键,它的值是对应的键。
    *不是数组,em[2]这种实际是访问的.2这个属性,并不是下标。
    *一般不需要关心值具体是多少,当然也可以自己设置部分或全部。
enum type = {right, center, left = 5}
type.right // 0
type[2]    // undefined
type[5]    // undefined
  • Any
    *any表示任意类型,不进行类型检查,使用在声明中,和Object接口的区别是能调用任意方法。
let notSure: any = 4 
notSure.ifItExists()  // 不检查
notSure.toFixed()     // 不检查 一定存在 Number.prototype.toFixed

let prettySure: Object = 4  // Object 值可以是任意类型
prettySure.toFixed()        // 检查的是Object接口拥有的属性
  • Unknown [3.0+]
    *unknown 表示未知类型,会进行类型检查,只可以将它赋值给 anyunknown。如果不缩小类型,就无法对 unknown 类型执行除此之外的任何操作。
let un: unknown = 4 
let ay: any = un
let Obj: Object = un
let num: number = un // 不能将类型“unknown”分配给类型“number”。
let obj: object = un // 不能将类型“unknown”分配给类型“object”。

类型缩小可以使用 类型断言 与 类型收缩

let un: unknown = 4
let num: number = <number>un //类型断言
// ======================================
let un: unknown = 4
let num: number
typeof un === 'number' && (num = un) // 类型收缩 我们自己处理了类型判断时
  • void
    *js中的void是一个一元操作符,可以跟任意值或表达式。返回undefined,优先级较高。
    *ts中,void表示值是undefined或null,相等于类型被设置为 undefinde|null 。

  • Never

    never类型表示的是那些永不存在的值的类型。
    never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使 any也不可以赋值给never。

    *似乎没有什么用,就是这个东西的结果什么也没有, 官方文档是一个不会有返回值的函数,函数默认返回undefined,这个东西undefined都不返回。

// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
    throw new Error(message)
}

// 推断的返回值类型为never // error 是 never 类型
function fail() {
    return error("Something failed")
}

// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
    while (true) {
    }
}
  • 类型断言
    *在使用时临时的变更类型。
    *在TypeScript里使用JSX时,只有as语法断言是被允许的。
// “尖括号”语法
let someValue: any = "this is a string"
let strLength: number = (<string>someValue).length

let someValue: number = 1223;
let strLength: number = (<Object>someValue) // 报错 Obeject 不能被赋值给 number

// as 语法
let someValue: any = "this is a string"
let strLength: number = (someValue as string).length   
  • 解构声明
    *定义右侧对象属性 a:string b:string,解构赋值时a被命名为newa
let {a: newa, b}: {a: string, b:string} = {a: 'null', b: null}
newa // 'null'
b    // null
  • 可选
let obj: {a: any, b?: number}
obj = {a: 1234123} // b是可存在可不存在的

*为对象声明属性需要指定全部拥有的和可能拥有的,如不确定可增加任意属性类型

  • 对象任意属性 与 只读类型
interface J {
    readonly id: number
    [propName: string]: any  // 这里设置的是任意类型
  }
  let obj1: J = {
      id: 1,
      name: 'name',
      age: 18
  }
  obj1.id = 2 // 报错 id 是只读的

*如果对象键是数字呢?可以使用映射对象类型

  • 映射对象类型
type J = {
    [propName in string | number]: any //这里设置的是任意类型
    ;
} & {
    readonly id: number;
};

let obj: J = {
    id: 1,
    name: 'haha',
    age: 4,
    a: 1,
    b: 2,
    1: 5
}

*如果对象键是symbol类型呢?

  • 对象键symbol类型/unique symbol类型
const key1 = Symbol()
const key2: symbol = Symbol()
const key3: unique symbol = Symbol() //TS 2.7+
type O = {
    [propName in string | number]: any
    
} & {
    readonly id: number;
    [key1]?: any,
    [key2]?: any, // 类型文本中的计算属性名称必须引用类型为文本类型或 "unique symbol" 类型的表达式。
    [key3]?: any,

}

let obj1: O = {
    id: 1,
    name: 'haha',
    age: 4,
    a: 1,
    1: 5
}
obj1[key1] = 2
obj1[key2] = 2 // 类型“symbol”不能作为索引类型使用。
obj1[key3] = 2