typescript学习

305 阅读1分钟

一、interface与type区别

1、相同点

(1)都可以描述一个对象或者函数

// 对象
interface User {
    name: string
    age: number
}
type User = {
    name: string
    age: number
}
// 函数
interface SetUser {
    (name: string, age: number): void;
}
type SetUser = (name: string, age: number) => void

(2)都可扩展,并且可以相互扩展,语法稍有不同

// interface extends interface
interface Name {
    name: string
}
interface User extends Name {
    age: number
}

// type extends type
type Name = {
    name: string
}
type User = Name & { age: number }

// interface extends type
type Name = {
    name: string
}
interface User extends Name {
    age: number
}

// type extends interface
interface Name {
    name: string
}
type User = Name & {
    age: number
}

2、不同点

(1)interface可以声明合并,type不可以

interface User {
    name: string
}
interface User {
    age: number
}
/*
* 实际的User接口为:
* interface User {
*     name: string
*     age: number
* }
*/

(2)type可以,interface不可以

(2-1)type可声明基本类型别名,联合类型,元祖等类型

// 基本类型别名
type Name = string

// 联合类型
interface Dog { 
    wang()
}
interface Cat {
    miao()
}
type Pet = Dog | Cat

// 元祖类型
type PetList = [Dog, Cat]

(2-2)type 语句中还可以使用 typeof 获取实例的类型进而进行赋值

let div = document.createElement('div')
type B = typeof div

(2-3)type其他

type NameLookup = Dictionary<string, Person>;
type Callback<T> = (data: T) => void;
type Pair<T> = [T, T];
type Coordinates = Pair<number>;
type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

使用原则:能用 interface 实现,就用 interface , 如果不能就用 type 。

原文链接:www.jb51.net/article/163…

原文链接:juejin.cn/post/684490…

二、is关键字使用场景

用于判断某个变量是否属于某种接口类型

export function isDate(val: any): val is Date {
    return Object.prototype.toString.call(val) === '[object Date]'
}