📄TS 类型
type
status
date
slug
summary
tags
category
icon
password
Status
基本的类型
boolean | number | string | symbol | bigint | null | undefined
默认情况下
null
和undefined
是所有类型的子类型,除非开启严格检查数组:
Array<T>
| T[]
元组:
[T1, T2]
枚举:enum 和 const enum
AnthoyFu不推荐在项目中使用enum,因为编译后的IIFE无法tree shaking,而const enum对esbuild不友好。
any类型
迁移 js 项目很有用,
any
会在编译时可选择地包含或移除类型检查。 Object
类型可能被认为有相似的作用,但是 Object
类型的变量只允许你给它赋任意值,却不能够在它上面调用任意方法,即便它真的有这些方法(除了 Object 类型自带的方法)。
void类型void表示没有任何类型,声明一个
void
类型的变量没有什么大用,因为你只能为它赋予undefined
和null
。never类型
never
类型表示的是那些永不存在的值的类型。 例如,never
类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型,变量也可能是never
类型,当它们被永不为真的类型保护所约束时。never
类型是任何类型的子类型(可以赋值给任何类型)。没有类型是never
的子类(赋值给never
类型,除了never
本身之外)。即使any
也不可以赋值给never
。下面是一些返回
never
类型的函数:类型断言
- 尖括号
- as 语法
当你在 TypeScript 里使用 JSX 时,只有 as 语法断言是被允许的。(所以只记 as 就ok)
接口Interface
对象字面量会被特殊对待而且会经过额外属性检查,当将它们赋值给变量或作为参数传递的时候。 如果一个对象字面量存在任何“目标类型”不包含的属性时,你会得到一个错误。
如何跳过检查?
- 赋值给一个变量,再传参
- 添加字符串索引签名
- 类型断言
类可以实现接口,但接口只能描述公共部分。
当你操作类和接口的时候,你要知道类是具有两个类型的:静态部分的类型和实例的类型。 你会注意到,当你用构造器签名去定义一个接口并试图定义一个类去实现这个接口时会得到一个错误:
这里因为当一个类实现了一个接口时,只对其实例部分进行类型检查。 constructor存在于类的静态部分,所以不在检查的范围内。
因此,我们应该直接操作类的静态部分。 看下面的例子,我们定义了两个接口,ClockConstructor为构造函数所用和ClockInterface为实例方法所用。 为了方便我们定义一个构造函数createClock,它用传入的类型创建实例。
因为createClock的第一个参数是ClockConstructor类型,在createClock(AnalogClock, 7, 32)里,会检查AnalogClock是否符合构造函数签名。
一个接口通过继承能够从一个接口里复制成员到另一个接口里可以继承多个接口,创建出多个接口的合成接口。
当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的private和protected成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现(implement)。
索引类型
支持两种索引类型:字符串和数字,两者可以同时使用且数字键对应的类型需要是字符串的子类型。因为当使用
number
来索引时,JavaScript会将它转换成string
然后再去索引对象。 也就是说用100
(一个number
)去索引等同于使用"100"
(一个string
)去索引,因此两者需要保持一致。重载列表
- 接口方式
- 多个同名函数声明
类
访问修饰符:
- public:自由访问
- private:类内才可访问
- protected:类及其派生类可访问,用在constructor相当于定义一个只能被继承的类(无法被new)。
- readonly:只读属性必须在声明时或构造函数里被初始化
static静态属性
参数位置添加修饰符可以简化this.xxx=xxx(参数和属性同名)的流程,相当于初始化列表。
定义存取器属性时,只带有
get
不带有set
的存取器自动被推断为readonly
。抽象类比起接口:
- 能使用访问修饰符(抽象方法对比用于描述函数的接口,抽象方法也可以函数重载)
- 方法可以有默认实现
类型别名
与接口区别:
- 编译器提示,悬浮在类型上时(注意不是变量),type上会展示对象字面量,interface只会展示其名字。
- 类型别名不能被
extends
和implements
(自己也不能extends
和implements
其它类型)。
- 你无法通过接口来描述一个类型并且需要使用联合类型(接口可以通过extends实现交叉类型)或元组类型,这时通常会使用类型别名。
- Twikoo