ts扩展类型
枚举
扩展类型:类型别名、枚举、接口、类
枚举通常用于约束某个变量的取值范围。
字面量和联合类型配合使用,也可以达到同样的目标。
字面量类型的问题
- 在类型约束位置,会产生重复代码。可以使用类型别名解决该问题。
- 逻辑含义和真实的值产生了混淆,会导致当修改真实值的时候,产生大量的修改。
// 定义一个类型别名 type Sex = "男"|"女" // ... 此处有1w行代码,用到了男女这个 sex = "男" 等 // 当有一天,产品过来说,把男改成帅哥,女改成美女,我们可以cv进行操作 // 又过了一天,产品说把帅哥改成male,美女改成female ... // 这样下去,我们的时间浪费在没有意义的地方上 // 不管是帅哥,还是male,他的逻辑意义都是男,w我们在代码中的使用了真实含义,这样会引起一些问题
- 字面量类型不会进入到编译结果。也就是说,如果我们要在编译后面使用这个类型,是会存在一些问题的。
枚举
如何定义一个枚举:
enum 枚举名{ 枚举字段1 = 值1, 枚举字段2 = 值2, ... }
枚举会出现在编译结果中,编译结果中表现为对象。表现的是一个对象。
枚举的规则:
- 枚举的字段值可以是字符串或数字
- 数字枚举的值会自动自增
- 被数字枚举约束的变量,可以直接赋值为数字
- 数字枚举的编译结果 和 字符串枚举有差异
最佳实践:
- 尽量不要在一个枚举中既出现字符串字段,又出现数字字段
- 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值
接口 interface
含义:是指对协定进行定义的引用类型。其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员
typescript接口作用: 用于约束类、对象、函数的契约(标准)
语法:
类似于声明枚举enum, 类型别名 type 一样,使用 interface开头进行声明,interface xx(接口的名字){xxx:type}
// 声明一个对象的接口 interface User { name: String, age: number } // 声明一个函数的接口 interface Greet{ sayHello: () => void, sayHi(): void }
看到这个约束对象,我门可能会想,type 类型别名也可以用来约束对象,那么类型对象和interface的异同是啥?
interface 与 type 的异同
由于篇幅太长,在另一篇文章中 传送门