一、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…
二、is关键字使用场景
用于判断某个变量是否属于某种接口类型
export function isDate(val: any): val is Date {
return Object.prototype.toString.call(val) === '[object Date]'
}