TS之数据类型(二)

111 阅读1分钟

any类型

  • 不使用此类型

any表示全集,所有类型的集合,

unknown类型

unknown表示未知集,不知道什么类型

const a: unknown = 100
// a.toFixed() // 报错,对象的类型为 "unknown"
// 使用断言 as
(a as number).toFixed()

never类型

  • 一般不使用此类型

never表示空集

type A = string & number // A 为 never 

enum

  • 枚举
  • 一般使用 number enum
  • 显然 Fruit1 没有 Fruit2 优雅
enum A {
  todo = 0, // 不设置时默认为 0
  done, // 1 自动从上一个值基础上递增
  archived, // 2
  deleted // 3
}

enum Fruit1 {
  apple = 'apple',
  banana = 'banana'
}
type Fruit2 = 'apple' | 'banana'

type

类型别名 Type Aliases (给类型取一个名字)

// string 类型
type S = string 
//联合类型
type FalseLike = '' | 0 | false | null | undefined 
// 函数
type Fn = (n: number, m: number) => number
// 带属性的函数
type FnWithProps = {
    (a: number, b: number): number
    prop: string
}
const fn_prop: FnWithProps = (a, b) => 100
fn_prop.prop = '函数的属性' // 不注明属性报错

interface

声明接口,描述对象的属性(declare the shapes of objects)

interface Data {
    [k: string]: string 
}
interface Point {
    x: number
    y: number
}
interface Points extends Array<Point> { }
interface Date2 extends Date {}
interface Fn {  // 带属性的函数
    (x: number, y: number): number
    prop: number
}
const fn: Fn = (a, b) => 900
fn.prop = 180  // 不注明属性报错
// 扩展String方法padZero
declare global {
    interface String {
        padZero(length: number): number
    }
}

type VS interface

区别:

  1. interface只描述对象类型,type是描述所有类型;
  2. interface是类型声明,type则是给类型起一个别名;
  3. interface会自动合并,多用于对外API,方便扩展,type不可重新赋值,一般用于对内API, 防止代码分散;

type vs interface.png