【ts】typescript高阶:键值类型及type与interface区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前端必备工具推荐网站(免费图床、API和ChatAI等实用工具):
http://luckycola.com.cn/

前言

学习目标:
1、键值类型的语法
2、type与interface的区别
3、类型别名与接口的一些使用场景总结


一、键值类型的语法

1、语法

// 键值类型语法
{ [key: KeyType]: ValueType }
// 注意在键值语法中KeyType类型只能是string、number、symbol或则模板字面量  不能是纯字面量

2、错误例子

// 错误例子
interface Dictionary {
  [key: boolean]: string;// 错误  keyType不能是boolean
};

// 模板字面量例子
interface ProChangeHandler {
  [key: `${string}Changed`]: () => void;// 正确
};
let handlers: ProChangeHandler = {
  idChanged: () => { },
  nameChanged: () => { },
  ageChange: () => { }, // 错误  不符合模板字面量规定的格式  少一个字符d
}

// 使用字面量的错误例子
interface User1 {
  [key: 'id']: string; // 错误 keyType不允许是字面量类型
}

interface User2 {
  [key: 'id' | 'age']: string; // 错误 keyType不允许是字面量类型
}

// 解决以上问题可以如果Record这个工具类型
type User3 = Record<'id', string>; // 正确
type User4 = Record<'id' | 'age', string>; // 正确

3、正确例子

// keyType是string类型时中括号取值
interface NumberNams {
  [key: string]: string;
}
let names: NumberNams = {
  '1': 'name',
  2: 'age', // 正确 在对象中属性都会经过隐式转换变成 string
};
const name = names['1']; // 正确
const name2 = names[1]; // 正确 会经过隐式转换变成 string

type N0 = keyof NumberNams; // 注意结果是 string | number,这说明由于隐式转换的作用在keyType中 string、number类型是兼容的

二、type与interface的区别

1.相同点一

代码如下(示例):

// 1.相同点一:类型别名和接口都可以用来描述对象或函数
// type
type Ponit = {
  x: number;
  y: string;
};
type SetPonit = (x: string) => void;
// interface
interface Ponit2 {
  x: number;
  y: string;
};
interface SetPoint2 {
  (x: number): number;
};

let fn1: SetPonit = (x: string) => { };
let fn2: SetPoint2 = (x: number): number => { return 1 };

2.相同点二

代码如下(示例):

// 2.相同点二:类型别名和接口都支持拓展

// type通过交叉运算拓展
type Animal = {
  name: string;
};
type Dog = Animal & { age: number };// {name: string;age: number};
// interfcae通过extends继承拓展(支持多继承)
interface Animal2 {
  name: string;
};
interface Cat extends Animal2 {
  color: string;
};// {name: sting;color: string;}

// 同时type和interface也支持一起使用来进行拓展
type Perple = {
  name: string;
};

interface Person {
  age: number;
}

type P1 = Perple & Person;// {name; string;age: number};
interface P2 extends Perple {
  color: boolean;
};// {color: boolean; name: string}

4.不相同点一

// 不同点:同名接口会自动合并,而别名不会
// 基于这个特性常常在项目中用于拓展第三方模块的类型
// interface
interface User1 {
  name: string;
};
interface User1 {
  age: number;
}
// 所以最终的User1是{name: string;age: number};

// type
type User2 = {
  name: string;
};
type User2 = {
  age: number;
}// 报错 别名定义重复

三、类型别名与接口的一些使用场景总结

使用类型别名的场景

  1. 定义基本类型的别名时,用type
  2. 定义元组类型时,用type
  3. 定义函数类型时,用type
  4. 定义联合类型时,用type
  5. 定义映射类型时,用type

使用接口的场景

  1. 利用接口自动合并特性时候,用interface
  2. 定义对象类型且无需type时,用interface

总结

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyCola2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值