typescipt类型相关注意事项

一、typescript数据类型 

TypeDescription
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:通过交叉类型(&)来实现。
  • 两者结合使用:可以混合 typeinterface,灵活组合对象和类型。

  

三、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的写法

 

posted @ 2025-02-21 16:11  我是格鲁特  阅读(33)  评论(0)    收藏  举报