最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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的靜態(tài)類型(強類型), 在全局和命名空間的全局里面 直接聲明一個函數(shù)要用到 function 關(guān)鍵字(就是js的function關(guān)鍵字),

而在類(class)里面卻不能使用function來聲明方法。

這其中是this的指向問題。

改成這樣就可以了

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

typescript中this的使用注意

最近的一個項目,用了 typescript 來寫js腳本,結(jié)果錯誤百出,修復(fù)的同時也讓我總結(jié)了ts 中該怎樣使用this。

ts 提供類似C# 和 java的靜態(tài)類型(強類型), 在全局和命名空間的全局里面 直接聲明一個函數(shù) 要用到 function 關(guān)鍵字(就是js的function關(guān)鍵字),而在類(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委托, 結(jié)果得到了 1 這個結(jié)果(A.count + 1 = 0 + 1 = 1)

讓我們在TypeScript 里面實現(xiàn)相同的功能:

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#一致 , 提供的靜態(tài)入口

你會發(fā)現(xiàn),這時候結(jié)果不再是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 從類的 方法 變成了 類的變量,更重要的是 我們在 構(gòu)造函數(shù)里面 使用 lamda 表達式 , 使用 lamda表達式 并不會改變this的作用域, 因為當前是一個構(gòu)造函數(shù),所以里面的this指向的是 當前的類,(查看一下生成的js會更容易理解, 函數(shù)里面已經(jīng)沒有了this)

從js的角度, 因為函數(shù)中沒有了this指針,所以也就不會因為 傳遞到其他的地方造成不一致的情況

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue中import為什么可以異步加載示例詳解

    Vue中import為什么可以異步加載示例詳解

    異步組件是實現(xiàn)這一目標的一種高效方式,它允許Vue在需要時才加載組件的代碼,從而顯著減少應(yīng)用的初始加載時間,這篇文章主要介紹了Vue中import為什么可以異步加載的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • vue實現(xiàn)添加與刪除圖書功能

    vue實現(xiàn)添加與刪除圖書功能

    這篇文章主要介紹了vue實現(xiàn)添加與刪除圖書功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • 詳解如何在Vue2中實現(xiàn)組件props雙向綁定

    詳解如何在Vue2中實現(xiàn)組件props雙向綁定

    在Vue2中組件的props的數(shù)據(jù)流動改為了只能單向流動,如何在Vue2中實現(xiàn)組件props雙向綁定 ,一起來跟小編看看。
    2017-03-03
  • Vue Ajax跨域請求實例詳解

    Vue Ajax跨域請求實例詳解

    這篇文章主要介紹了Vue Ajax跨域請求實例詳解,需要的朋友可以參考下
    2017-06-06
  • vue element 多圖片組合預(yù)覽的實現(xiàn)

    vue element 多圖片組合預(yù)覽的實現(xiàn)

    本文主要介紹了vue element多圖片預(yù)覽實現(xiàn)的相關(guān)資料,最近的項目中有圖片預(yù)覽的場景,本文就來介紹一下如何使用,感興趣的可以了解一下
    2023-08-08
  • vue項目的html如何引進public里面的js文件

    vue項目的html如何引進public里面的js文件

    這篇文章主要介紹了vue項目的html如何引進public里面的js文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • VUE2實現(xiàn)加載Unity3d的項目實踐

    VUE2實現(xiàn)加載Unity3d的項目實踐

    本文主要介紹了在Vue2中通過UnityWebGL導(dǎo)出和動態(tài)加載實現(xiàn)Unity3D內(nèi)容加載的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2025-09-09
  • Vue-router 切換組件頁面時進入進出動畫方法

    Vue-router 切換組件頁面時進入進出動畫方法

    今天小編就為大家分享一篇Vue-router 切換組件頁面時進入進出動畫方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue-cli如何引入bootstrap工具的方法

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

    本篇文章主要介紹了vue-cli如何引入bootstrap工具的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • vue+element實現(xiàn)表格新增、編輯、刪除功能

    vue+element實現(xiàn)表格新增、編輯、刪除功能

    這篇文章主要為大家詳細介紹了vue+element實現(xiàn)表格新增、編輯、刪除功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論

老河口市| 新蔡县| 班戈县| 雷州市| 桓台县| 蓝田县| 冀州市| 屏东县| 海兴县| 北安市| 科技| 南通市| 柘城县| 博罗县| 伊吾县| 康保县| 长治市| 乌兰县| 巴青县| 公安县| 武平县| 邯郸县| 洛南县| 霍山县| 通州市| 大方县| 佛冈县| 旌德县| 三台县| 兖州市| 彰武县| 天峻县| 神池县| 鄱阳县| 德阳市| 高碑店市| 新蔡县| 丰宁| 云安县| 洪泽县| 长丰县|