typescript中this报错的解决

 更新时间:2023年01月21日 08:28:53   作者:Codingwithlife  
这篇文章主要介绍了typescript中this报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

typescript中this报错

export class AppComponent {
  title = 'myapp';
  count=1;
  clickme=function(){
      this.count++; 
  }

在上述代码中

使用this报错: 'this' implicitly has type 'any' because it does not have a type annotation.

function处报错: An outer value of 'this' is shadowed by this container

出错原因

ts 提供类似C# 和 java的静态类型(强类型), 在全局和命名空间的全局里面 直接声明一个函数要用到 function 关键字(就是js的function关键字),

而在类(class)里面却不能使用function来声明方法。

这其中是this的指向问题。

改成这样就可以了

export class AppComponent {
  title = 'myapp';
  count=1;
  clickme=()=>{
    this.count++;
  }
}

typescript中this的使用注意

最近的一个项目,用了 typescript 来写js脚本,结果错误百出,修复的同时也让我总结了ts 中该怎样使用this。

ts 提供类似C# 和 java的静态类型(强类型), 在全局和命名空间的全局里面 直接声明一个函数 要用到 function 关键字(就是js的function关键字),而在类(class)里面却不能使用function来声明方法。

让我们来比较 它与 C# 的不同

    public delegate int handle();
    public class Program
    {
        public static void Main(string[] args)
        {
            var t = new Test();
            var a = new A();
            t.h = a.hander;
            t.count = t.h();
            Console.WriteLine("count is:{0}",t.count); 
            // output:
            // count is:1
        }
    }
    public class Test
    {
        public handle h;
        public int count = 100;
    }
    public class A
    {
        private int count = 0;
        public int hander()
        {
            this.count +=1;
            return this.count;
        }
    }

这个代码在class A里面 放了一个方法,并将这个方法作为一个委托 给了 class program 的 h 字段, 最后在 Main 方法里面运个 h委托, 结果得到了 1 这个结果(A.count + 1 = 0 + 1 = 1)

让我们在TypeScript 里面实现相同的功能:

class A {
    public count: number = 0;
    public hander(): number {
        this.count += 1;
        return this.count;
    }
}


class Test {
    public count: number = 100;
    public h: () => number;
}

class Program {

    static Main(): void {
        let t = new Test();
        let a = new A();
        t.h = a.hander;
        t.count = t.h();
        console.log(`count is :${t.count}`);
        // output
        // count is :101
    }
}

Program.Main();// 为了跟C#一致 , 提供的静态入口

你会发现,这时候结果不再是1,而是101, 造成差异的原因是js的 this 指针 , 在 C# 中 this 总是指向当前的类,而 js中的this可以改变, 当 t.h = a.hander 的时候 t.h 中的this 变成了 Test 类。 而在 typescript中,因为当前定义的是一个类,所以其this 总是指向 类,所以TS 直接使用js中的this.

然而 有办法解决这个问题么? 当然有。 让我们来改变 class A

class A {
    constructor() {
        this.hander = ()=>{
            this.count += 1;
            return this.count;
        }
    }
    public count: number = 0;
    public hander: () => number;
}

这样我们把hander 从类的 方法 变成了 类的变量,更重要的是 我们在 构造函数里面 使用 lamda 表达式 , 使用 lamda表达式 并不会改变this的作用域, 因为当前是一个构造函数,所以里面的this指向的是 当前的类,(查看一下生成的js会更容易理解, 函数里面已经没有了this)

从js的角度, 因为函数中没有了this指针,所以也就不会因为 传递到其他的地方造成不一致的情况

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue中import为什么可以异步加载示例详解

    Vue中import为什么可以异步加载示例详解

    异步组件是实现这一目标的一种高效方式,它允许Vue在需要时才加载组件的代码,从而显著减少应用的初始加载时间,这篇文章主要介绍了Vue中import为什么可以异步加载的相关资料,需要的朋友可以参考下
    2026-05-05
  • vue实现添加与删除图书功能

    vue实现添加与删除图书功能

    这篇文章主要介绍了vue实现添加与删除图书功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • 详解如何在Vue2中实现组件props双向绑定

    详解如何在Vue2中实现组件props双向绑定

    在Vue2中组件的props的数据流动改为了只能单向流动,如何在Vue2中实现组件props双向绑定 ,一起来跟小编看看。
    2017-03-03
  • Vue Ajax跨域请求实例详解

    Vue Ajax跨域请求实例详解

    这篇文章主要介绍了Vue Ajax跨域请求实例详解,需要的朋友可以参考下
    2017-06-06
  • vue element 多图片组合预览的实现

    vue element 多图片组合预览的实现

    本文主要介绍了vue element多图片预览实现的相关资料,最近的项目中有图片预览的场景,本文就来介绍一下如何使用,感兴趣的可以了解一下
    2023-08-08
  • vue项目的html如何引进public里面的js文件

    vue项目的html如何引进public里面的js文件

    这篇文章主要介绍了vue项目的html如何引进public里面的js文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • VUE2实现加载Unity3d的项目实践

    VUE2实现加载Unity3d的项目实践

    本文主要介绍了在Vue2中通过UnityWebGL导出和动态加载实现Unity3D内容加载的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • Vue-router 切换组件页面时进入进出动画方法

    Vue-router 切换组件页面时进入进出动画方法

    今天小编就为大家分享一篇Vue-router 切换组件页面时进入进出动画方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue-cli如何引入bootstrap工具的方法

    vue-cli如何引入bootstrap工具的方法

    本篇文章主要介绍了vue-cli如何引入bootstrap工具的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • vue+element实现表格新增、编辑、删除功能

    vue+element实现表格新增、编辑、删除功能

    这篇文章主要为大家详细介绍了vue+element实现表格新增、编辑、删除功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05

最新评论