3

以下のコードで興味深いことに気付きました。「:Hero」をコメントアウトすると、コードは正常に機能しますが、コメントを外してヒーローにタイプを与えると. それは壊れます-ページはレンダリングさえしません。私が見ることができることから、hero は暗黙のうちに Hero 型であるのに、明示的にできないのはなぜですか。

@Input() hero/*: Hero*/;

この問題のデモを行うために、4 つのファイルを含む単純なプロジェクトを用意しました。上記のコードは、hero-detail.component.ts の末尾にあります。

import {Component, Input} from 'angular2/core';
import {Hero} from './hero';
@Component({
  selector: 'my-hero-detail',
  template: `
    <div *ngIf="hero">
      <h2>{{hero.name}} details!</h2>
      <div><label>id: </label>{{hero.id}}</div>
      <div>
        <label>name: </label>
        <input [(ngModel)]="hero.name" placeholder="name"/>
      </div>
    </div>
  `
})
export class HeroDetailComponent {
   @Input() hero/*: Hero*/;
}

hero.ts は Hero インターフェースを定義します:

export interface Hero {
  id: number;
  name: string;
}

app.component.ts は hero-detail.component.ts と通信します。

import {Component} from 'angular2/core';
import {Hero} from './hero';
import {HeroDetailComponent} from './hero-detail.component';
@Component({
  selector: 'my-app',
  template:`
    <h1>{{title}}</h1>
    <h2>My Heroes</h2>
    <ul class="heroes">
      <li *ngFor="#hero of heroes"
        [class.selected]="hero === selectedHero"
        (click)="onSelect(hero)">
        <span class="badge">{{hero.id}}</span> {{hero.name}}
      </li>
    </ul>
    <my-hero-detail [hero]="selectedHero"></my-hero-detail>
  `,
  styles:[`
    .heroes {list-style-type: none; margin-left: 1em; padding: 0; width: 10em;}
    .heroes li { cursor: pointer; position: relative; left: 0; transition: all 0.2s ease; }
    .heroes li:hover {color: #369; background-color: #EEE; left: .2em;}
    .heroes .badge {
      font-size: small;
      color: white;
      padding: 0.1em 0.7em;
      background-color: #369;
      line-height: 1em;
      position: relative;
      left: -1px;
      top: -1px;
    }
    .selected { background-color: #EEE; color: #369; }
  `],
  directives: [HeroDetailComponent]
})
export class AppComponent {
  public title = 'Tour of Heroes';
  public heroes = HEROES;
  public selectedHero: Hero;
  onSelect(hero: Hero) { this.selectedHero = hero; }
}
var HEROES: Hero[] = [
  { "id": 11, "name": "Mr. Nice" },
  { "id": 12, "name": "Narco" },
  { "id": 13, "name": "Bombasto" },
  { "id": 14, "name": "Celeritas" },
  { "id": 15, "name": "Magneta" },
  { "id": 16, "name": "RubberMan" },
  { "id": 17, "name": "Dynama" },
  { "id": 18, "name": "Dr IQ" },
  { "id": 19, "name": "Magma" },
  { "id": 20, "name": "Tornado" }
];

index.html はおそらく問題との関連性が最も低いため、最後のファイルは次のとおりです。

<!DOCTYPE html>
<html>
  <head>
    <title>Angular 2 QuickStart</title>
    <!-- bootstrap -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">

    <!-- 1. Load libraries -->
        <script src="https://rawgithub.com/systemjs/systemjs/0.19.6/dist/system.js"></script>
        <script src="https://code.angularjs.org/tools/typescript.js"></script>
        <script src="https://code.angularjs.org/2.0.0-beta.0/angular2-polyfills.js"></script>
        <script src="https://code.angularjs.org/2.0.0-beta.0/Rx.js"></script>
        <script src="https://code.angularjs.org/2.0.0-beta.0/http.dev.js"></script>
        <script src="https://code.angularjs.org/2.0.0-beta.0/angular2.dev.js"></script>

    <!-- 2. Configure SystemJS -->
    <script>
        System.config({
            transpiler: 'typescript', 
            typescriptOptions: {emitDecoratorMetadata: true}, 
            packages: {'app': {defaultExtension: 'ts'}} 
        });
        System.import('app/boot')
            .then(null, console.error.bind(console));
    </script>

  </head>

  <!-- 3. Display the application -->
  <body>
    <my-app>Loading...</my-app>
  </body>

</html>
4

2 に答える 2

1

これは思いつきました、面白かったです。

  1. 「export interface Hero」を「export class Hero」に変更したら、問題は解決しました。それ以外の場合は、「予期しないトークンのエクスポート」について不平を言いました。
  2. ただし、事前に ts ファイルを js ファイルにトランスパイルしておけば、問題は解決します。問題は、変換がその場で行われた場合にのみ存在しました。

    packages: {'app': {defaultExtension: 'ts'}} // change 'ts' to 'js'

于 2015-12-31T01:34:58.150 に答える
1

バグではありません。型は、書き込みおよびコンパイル プロセス中にのみ存在します。JavaScript 入力デコレータでは、次のように変換されます。

__decorate([core_1.Input("title"), 
  __metadata('design:type', Object)
], MyComponent.prototype, "title", void 0);

とにかく、エディタまたは Linter はこれについて警告する必要があります。

于 2015-12-28T07:48:50.120 に答える