【问题标题】:converting javascript to typescript in angular4 component class在angular4组件类中将javascript转换为打字稿
【发布时间】:2018-10-19 17:35:32
【问题描述】:

下面是我在 Javascript 中的代码。我需要在 Angular 组件内的组件类中编写它。

根据我的理解,Character.prototype.placeAt() 代码向现有对象添加了新方法或属性。或者,在这种情况下,placeAt() 内的this.tile = tileTo; 将使用全局 tileTo 变量更新 Character Object 的实例。但是如何将其转换为 Typescript?

<script type="text/javascript">
    tileFrom:any = [1, 1];
    tileTo = [1, 1];
    function Character() {
        this.tileFrom = [1, 1];
        this.tileTo = [1, 1];
        this.tile = tileTo;

    }
    Character.prototype.placeAt = function (x, y) {
        this.tileFrom = [x, y];
        this.tileTo = [x, y];
        this.tile = tileTo;
    };
    var player = new Character();
    player.placeAt(..);

</script>

我尝试将其转换如下,但我无法在 typescript 类中使用 Character.prototype,因为我收到错误:'duplicate identifier Character'。那么如何将placeAt() 添加到 Character 对象中呢?

是否可以在不使用 this 或发送类实例的情况下访问类变量?由于这会随上下文而变化,即在placeAt() 方法中,this 指的是 Character 对象。

export class GametrainComponent implements AfterViewInit  {
     tileFrom = [1, 1];
     tileTo = [1, 1];
     Character(self) {
        console.log("ss "+self.tileW)
        this.tileFrom = [1, 1];
        this.tileTo = [1, 1];
        this.tile = self.tileTo;

    };
    Character.prototype.placeAt(x:any, y:any, self) { //error duplicate identifier Character
        this.tileFrom = [x, y];
        this.tileTo = [x, y];
        this.tile = self.tileTo;

    };
    ngAfterViewInit() {
        self = this;
        this.player = new this.Character(self);
        player.placeAt(..);
    }
}

请注意,我是 JavaScript 和 Angular 的新手。

【问题讨论】:

  • 了解 TypeScript 类语法的基础知识。 typescriptlang.org/docs/handbook/classes.html
  • 不要使用any
  • 您应该为所有字段和参数声明类型。
  • @SLaks 我会关注那些 cmets。谢谢你。但这些都不是最终答案吧!
  • 发生该错误是因为您的类语法没有意义。您需要遵循 TypeScript 语法。

标签: javascript angular typescript


【解决方案1】:

字符应该是它自己的具有属性和方法的类。它看起来像这样:

character.model.ts:

export class Character {

  constructor(
    public tileFrom: Tile,
    public tileTo: Tile,
    public tile: Tile
  ) {}

  placeAt(x, y) {
    this.tileFrom = [x, y];
    this.tileTo = [x, y];
    this.tile = this.tileTo;
  }

}

gametrain.component.ts:

import { Character } from 'file/path';

export class GametrainComponent implements AfterViewInit  {

  player: Character;

  constructor() {}

  ngAfterViewInit() {
      this.player = new Character([1, 1], [1, 1], [1, 1]);
  }

  moveCharacter(tile: Tile) {
    this.player.placeAt(tile);
  }
}

或者,如果您的角色总是从同一个位置开始,那么您可以在 Character 类中设置这些值,并且在创建新角色时不必将值传递给它。

【讨论】:

  • 谢谢。你知道如何在没有 'this.var' 的情况下始终以 'var' 的形式访问类变量吗?由于“this”随上下文而变化,我无法使用“this.var”访问类变量。
  • 把一个类想象成一个巨大的物体。因此,您无需考虑定义变量,而是定义属性。所以你不需要设置var你只需输入属性的名称。因此,在 Character 类中,您无需使用 var tileForm 设置变量,您只需声明名称 tileForm 即可定义属性。在上面的示例中,您可以看到我在 GametrainComponent 中使用 player 所做的。我声明了一个属性player,它的类型是Character。将播放器设置为 new Character() 后,您可以执行 this.player.placeAt()this.player.tileFrom
  • 如果你想引用在同一个类中定义的属性,你需要使用this,因为你使用的是属于类本身的属性。所以在GametrainComponent,如果我想访问播放器,我必须使用this.player。但我可以在最后添加访问属于播放器的任何属性或方法:this.player.tileTo
  • 在同一个类中调用方法也是如此。如果您想在GametrainComponent 中调用moveCharacter(),则需要调用this.moveCharacter()。但请记住,类是一个对象。你不能把它想象成&lt;script&gt; 标签之间的代码。它不会贯穿每一行,因此您不能只将this.moveCharacter([1, 2]) 放在课程的最后一行。您必须从属于该类的另一个方法、模板或其他类中调用它。
  • 谢谢。我想我明白了。让我试试。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 2021-12-19
  • 2018-11-10
  • 2020-10-30
  • 2022-10-14
  • 2019-06-21
  • 2020-12-15
  • 2020-12-27
相关资源
最近更新 更多