Typescript高级: 详解 any、object、Object、Record<any, any> 和泛型 T

any 类型

  • any 类型是 TypeScript 中一个特殊的类型,它表示可以是任意类型的值

  • 使用 any 类型会失去 TypeScript 的类型检查能力

  • 相当于告诉编译器“相信我,我知道这个值的类型”

  • 语法示例

    let anyVar: any;
    anyVar = 123;
    anyVar = "hello";
    anyVar = {
          name: "Alice" };
    
    // 使用 any 类型后,再用 is 来指定某一类型
    if (typeof anyVar === "string") {
         
        console.log(anyVar.toUpperCase()); // 编译器不会报错
    }
    
  • 在上面的例子中,anyVar 可以被赋值为任何类型的值

  • 在 if 语句中,我们使用了 JavaScript 的 typeof 操作符来检查 anyVar 是否为字符串类型

  • 如果是,则调用 toUpperCase() 方法,此时虽然使用了 any 类型

  • 但通过 is 类型的检查,我们仍然可以安全地使用字符串的方法

  • any 类型它允许你在编译时绕过类型检查

  • 换句话说,当你将一个变量声明为 any 类型时,你可以为它赋予任何类型的值

  • 并且TypeScript编译器不会对该变量进行类型检查

  • 这在你刚开始使用TypeScript或不确定某个变量的确切类型时非常有用

  • 但过度依赖 any 可能会使你的代码失去类型安全性,从而引入运行时错误

  • 应用any,在编译期可能会通过,但在运行时,可能会报错

    let value: any;
    
    value = "Hello, world!"; // 可以是字符串
    value = 42;             // 可以是数字
    value = true;           // 可以是布尔值
    value = {
          name: "Alice" }; // 可以是对象
    value = [1, 2, 3];      // 可以是数组
    value = null;           // 可以是null
    value = undefined;      // 可以是undefined
    
    // 调用任何方法或访问任何属性都不会引起编译错误
    value.someNonExistentMethod(); // 运行时可能会出错,因为方法可能不存在
    console.log(value.someNonExistentProperty); // 运行时可能是undefined,因为属性可能不存在
    
  • 注意事项

    • 虽然 any 类型非常灵活,但过度使用它会带来一些负面影响:
      • 失去类型安全性:使用 any 意味着你放弃了TypeScript提供的类型检查,这可能导致运行时错误,因为编译器不会为你捕获类型不匹配的问题
      • 可读性和可维护性降低:当代码中的变量或函数返回类型为 any 时,其他开发者可能不清楚这个变量的确切类型,从而增加了理解和维护的难度
      • 丧失类型推断:当你使用 any 类型时,TypeScript的类型推断功能将不再适用,因为编译器不会尝试推断 any 变量的更具体类型
  • 最佳实践

    • 避免使用 any:尽量使用具体的类型,而不是 any。这有助于捕获类型错误并增强代码的可读性和可维护性
    • 逐步替换 any:如果你正在处理一个大型代码库,并且其中已经使用了大量的 any,考虑逐步替换它们为更具体的类型。这可能需要一些时间和努力,但可以提高代码的质量
    • 使用类型守卫和类型断言:如果你确实需要处理不确定类型的值,可以考虑使用类型守卫(通过条件语句或类型谓词函数)来缩小类型的范围,或使用类型断言(as 语法)来明确告诉编译器你期望的类型
  • 使用类型守卫和类型断言示例

    function isNumber(value: any): value is number {
         
        return typeof value === 'number';
    }
    
    function processValue(value: any) {
         
        if (isNumber(value)) {
         
            // 在这个分支中,TypeScript知道value是number类型
            console.log(value * 2);
        } else {
         
            // 否则,value仍然是any类型
            console.log(value.toString()); // 这里可能需要进一步的类型检查或断言
        }
    }
    
    let someValue: any = 42;
    processValue(someValue); // 输出:84
    
    someValue = "Hello";
    processValue(someValue); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值