基础类型
# 变量类型
ts是强类型,在声明变量的时候,我们必须给他一个类型 具体类型:
1. number
2. string
3. boolean
4. enum
5. Array
6. Tuple
6. Symbol;
7. undefined
8. any
9. null
10. void
# array
写法一: 在元素类型后面加上[]
let arr: number[] = [1, 2, 3];
写法二: 数组泛型,Array<元素类型>
let arr1: Array<number> = [1, 2, 3];
# Tuple
元组类型允许表示一个已知元素数量和类型的数组,混合类型, 对应位置的类型需要相同。
let a: [string, number];
// 正确写法
a = ['hello', 1]; // OK
// 不能这样写不然会报错
a = [1, 'hello']; // Error
a = [1, 1, '1']; // Error
# symbol 类型
- 只能通过objInfo[symbol] 的方式修改属性值
const symbol = Symbol('userName')
let objInfo = {
[symbol]: 'wsh'
}
- 对象中的symbol 属性:
Object.getOwnPropertySymbols(objInfo)
Reflect.ownKeys(objInfo)
- symbol.for(): 根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中
- symbol.keyFor(): 获取 symbol 注册表中与某个 symbol 关联的键, 如果使用基本的symbol创建的,结果就是undefined
# any
any, 为不清楚类型的变量指定一个类型, 退出类型检查
# void
void 表示没有任何类型。当一个函数没有返回值时,其返回值类型通常是 void.
声明一个void类型的变量只能为它赋予undefined和null
# null/undefined
- 默认情况下null和undefined是所有类型的子类型。 例如可以把 null和undefined赋值给number类型的变量。
# never
never, 表示永远不会有值的一种类型
- 那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型
function error(message: string): never {
throw new Error(message);
}
- 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
- 错误示例
// 这个函数不能申明其返回值类型是 never
function warnUser(): void {
console.log("This is my warning message");
}
const foo: never = 123; // Error: number 类型不能赋值给 never 类型
- 使用用例
function foo(x: string | number): boolean {
if (typeof x === 'string') {
return true;
} else if (typeof x === 'number') {
return false;
}
// 如果不是一个 never 类型,这会报错:
// - 不是所有条件都有返回值 (严格模式下)
// - 或者检查到无法访问的代码
// 但是由于 TypeScript 理解 `fail` 函数返回为 `never` 类型
// 它可以让你调用它,因为你可能会在运行时用它来做安全或者详细的检查。
return fail('Unexhaustive');
}
function fail(message: string): never {
throw new Error(message);
}
# unknown
- 任何类型都可以赋值unknow
- 如果没有类型断言或者基于控制流的类型细化时,unknown不可以赋值给其他类型
let value2: unknown;
let value3: string = value2
- 如果没有类型断言或者基于控制流的类型细化时,不能在他上面进行任何操作
let value3: unknown;
value3+= 23
- unknown与任何其他类型组成的交叉类型,最后都等于其他类型
type type1 = string & unknown
type type2 = number & unknown
type type3 = unknown & unknown
- unknown与任何其他类型(除了any)组成的联合类型,最后都等于unknown
type type5 = unknown | string
type type6 = unknown | any
- never是unknown的子类型
type type6 = never extends unknown ? true : false;
- keyof unknown 等于类型never
type type7 = keyof unknown
- 只能对 unknown 进行等于/不等于操作,不能进行其他操作
- unknown 类型的值不能访问他的属性、作为函数调用和作为类创建实例
- 使用映射类型时如果遍历的是unknown类型,则不会映射任何属性
type Types<T> = {
[P in keyof T]: number
}
type type11 = Types<any>
type type12 = Types<unknown>
null / undefined
编译器不能消除null或者undefined,可以使用类型断言操作员手动删除它们。语法是后缀【!】
const getLengthFunc = (value: string | null): number => {
return (value || "").length;
};
function getSpliceStr(num: number | null): string {
function getRs(prefix: string) {
return prefix + num!.toFixed().toString();
}
num = num || 0.1;
return getRs('liston-');
}
console.log(getSpliceStr(2.002))
# noImplicitAny
选项 noImplicitAny 用来告诉编译器,当无法推断一个变量时发出一个错误(或者只能推断为一个隐式的 any 类型),你可以:
- 通过显式添加 :any 的类型注解,来让它成为一个 any 类型;
- 通过一些更正确的类型注解来帮助 TypeScript 推断类型。 官方文档 (opens new window)