typescript中的type关键字和interface关键字区别

Type又叫类型别名(type alias),作用是给一个类型起一个新名字,不仅支持interface定义的对象结构,还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。

TypeScript 复制代码
type num = number; // 基本类型
type stringOrNum = string | number; // 联合类型
type person = {name: string}; // 对象类型
type user = person & { age: number } // 交叉类型
type data = [string, number]; // 元组
type fun = () => void; // 函数类型

type和interface的相同点

1.都可以用来描述一个对象或者函数

interface

TypeScript 复制代码
interface user {name: string; age:number}; // 对象
 
interface setUser {(name: string; age:number):void}; // 函数

type:

TypeScript 复制代码
 type user = {name: string; age:number}; // 对象
 
 type setUser = (name: string; age:number):void;//函数

2.都可以进行拓展

interface可以扩展,type可以通过交叉实现interface的extends行为,interface可以extends type,同时type也可以与interface类型交叉。

TypeScript 复制代码
// interface通过extends实现继承
interface userName {
  name: string;
}
interface user extends userName {
  age: number
}
let stu:user = {name: 'wang', age: 10}


// interface的extends扩展可以通过type交叉(&)类型实现
type userName = {
   name: string;
}
type user = userName & {age: number}
let stu:user={name: 'wang', age: 18}


// interface扩展type
type name = {
  name: string;
}
interface user extends name {
  age: number;
}
let stu:user={name: 'wang', age: 89}


// type与interface交叉
interface name {
  name: string;
}
type user = name & {
  age: number;
}
let stu:user={name:'wang', age: 18}

type和interface的不同点

1.类型别名可以用于其它类型 (联合类型、元组类型、基本类型(原始值)),interface不支持

2.interface 可以多次定义来合并声明,type 不支持

TypeScript 复制代码
interface user {
    name: string;
    age: number;
}
interface user {
    sex: string;
}
//user实际接口为:
{
    name: string;
    age: number;
    sex: string;
}

3.type 能使用 in 关键字生成映射类型,但 interface 不行

TypeScript 复制代码
type keys = 'firstname' | 'surname';
 
type nameTypes = {
  [key in Keys]: string;
};
const test: nameTypes = {
  firstname: 'Pawel',
  surname: 'Grzybek',
};

4.默认导出方式不同

TypeScript 复制代码
// inerface 支持同时声明,默认导出 而type必须先声明后导出
export default interface name {
  name: string;
};

// 同一个js模块只能存在一个默认导出
 type typeName = {name: string};
  export default typeName

5.在type中可以使用泛型

TypeScript 复制代码
type Zoo<T> = T;
const num : Zoo<number> = 3;
 
type callback<T> = (data: T) => void;

6.type可以使用typeof获取实例类型

TypeScript 复制代码
let div = document.createElement('div');
type divType = typeof div;
相关推荐
kyriewen1 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师2 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马2 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒2 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚3 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲3 小时前
python中的类型标注
前端
计算机魔术师3 小时前
从硅谷测试到全球铺开,ChatGPT广告的10亿美元秘密
前端
专业抄代码选手4 小时前
08|Fiber 上的 `useState`:状态终于属于具体组件
前端·javascript·react.js
默_笙4 小时前
😭 Vibe Coding 翻车实录:AI 编程为什么必须先写"剧本"
前端·javascript
LEE4 小时前
原来 Claude Code 最厉害的工具,一行代码都不写
前端·后端