typescipt类型相关注意事项
一、typescript数据类型
| Type | Description |
|---|---|
| any | 表示任意类型,可以赋值为任何类型。 |
| unknown | 表示类型不确定,通常需要进一步检查。 |
| void | 表示没有返回值的函数,默认返回 `undefined`。 |
| never | 表示函数永远不会返回,通常用于抛出异常或死循环。 |
| boolean | 表示布尔值:`true` 或 `false`。 |
| number | 表示数字,可以是整数或浮点数。 |
| bigint | 表示大整数,精度比 `number` 更高。 |
| string | 表示文本数据,是一系列字符。 |
| symbol | 表示独特的标识符,用于对象属性或元数据。 |
| object | 表示非原始类型的对象,通常为 `null` 或对象类型。 |
| Array | 表示数组类型,可以存储多个相同类型的元素。 |
| Tuple | 表示一个固定大小的、元素类型已知的数组。 |
| Enum | 表示列举类型,包含一组命名的常量值。 |
| Function | 表示一个函数类型,可以定义参数和返回值类型。 |
| Object | 表示一般的对象类型,或者更具体的类型。 |
| Record | 表示键为特定类型,值为另一个类型的对象。 |
| Map | 表示键值对映射的集合。 |
| Set | 表示无重复元素的集合。 |
| Date | 表示日期和时间的数据类型,包含日期和时间信息。 |
二、type和interface的区别
| 关键特性 | interface | type |
| 扩展(继承) | ✅ 支持 extends 继承、implements 实现 |
✅ 支持交叉类型 &(更灵活) |
| 是否会合并 | ✅ 会自动合并(声明合并) | ❌ 不会合并,重名会报错 |
| 使用场景 | 一般用于对象、class;主要用于继承 | 可用于对象、基本类型、函数、联合类型、元组等;用于复杂类型 |
重复定义时,interface会自动合并,而type会报错:
interface User {
name: string;
}
interface User {
age: number;
}
//✅ 自动合并,具有两个属性
const u: User = { name: "Alice", age: 25 };
type User = { name: string; };
type User = { age: number; }; // ❌ 报错,不能重复声明
interface可以继承type吗?type能在交叉类型中使用interface吗?
interface继承type:可以直接使用extends来继承。type继承interface:通过交叉类型(&)来实现。- 两者结合使用:可以混合
type和interface,灵活组合对象和类型。
三、never和void
void:表示没有返回值,函数结束时返回undefined。适用于 没有返回值的函数。
function executeCallback(callback: () => void) { callback(); }never:表示永远不会有返回值,适用于不会正常结束的函数(例如函数会抛出异常 或 死循环)
function throwError(message: string): never { throw new Error(message); // 永远不会返回 } function infiniteLoop(): never { while (true) { // 永远不会退出 } }
在某些情况下,
never用于表示不能到达的代码,例如:function handleValue(value: "a" | "b"): void { switch (value) { case "a": console.log("A"); break; case "b": console.log("B"); break; default: // 这里永远不会被执行,因为 `value` 只能是 "a" 或 "b" const neverValue: never = value; // 会报错,value 不是 never 类型 throw new Error("Unexpected value"); } }
四、record
是 TypeScript 的一个内置泛型类型,用于创建一个对象类型,其中 键是特定类型的联合类型,而 值是另一个指定类型。
简单用法如下:
type Person = Record<string, number>; const ages: Person = { Alice: 25, Bob: 30, Charlie: 35 };
键为特定字符串的对象:
type Status = "success" | "error" | "loading"; type ApiResponse = Record<Status, string>; const response: ApiResponse = { success: "Data loaded successfully", error: "Failed to load data", loading: "Data is being loaded" };
在这个例子中,Record<Status, string> 创建了一个对象类型,键必须是 "success" | "error" | "loading",而值必须是字符串类型。
五、is和as
is:用于 类型保护,帮助 TypeScript 确定变量在某一代码块中的具体类型。
interface Dog { bark(): void; } interface Cat { meow(): void; } function isDog(animal: Dog | Cat): animal is Dog { return (animal as Dog).bark !== undefined; } const pet: Dog | Cat = { bark() { console.log("Woof!"); } }; if (isDog(pet)) { pet.bark(); // 在这里 TypeScript 知道 `pet` 是 `Dog` } else { pet.meow(); // 在这里 TypeScript 知道 `pet` 是 `Cat` }
as:用于 类型断言和强制转换,告诉 TypeScript 某个变量应该被视为某种类型。
//类型断言 let variable = value as TypeName; //强制转换 let someValue: any = "Hello, world!"; let stringLength: number = (someValue as string).length;
强制转换也可以用
<string>someValue的写法

浙公网安备 33010602011771号