Typescript では、オプションのパラメーターは疑問符でマークできることを知っています。
ただし、実際に新しいキーワードでクラスをインスタンス化する唯一の方法です。
問題は、Angular 2のスターター「ヒーロー」チュートリアルクラスに基づいて、新しいキーワードを介してインスタンス化されておらず、Angularが内部で行っていることを理解していることです。
たとえば、私はこのコードを持っています:
models / users.ts
export class User {
id: number;
name: string; // I want this to be optional
}
models / mock-users.ts
import {User} from './user';
export var USERS: User[] = [
{
id: 1
// no name (I wanted it to be optional for user with id 1)
},
{
id: 2,
name: "User 2"
},
]
services / user.service.ts
import {Injectable} from 'angular2/core';
import {USERS} from './../models/mock-users';
@Injectable()
export class UserService {
getUsers() {
return Promise.resolve(USERS);
}
}
views / my-component.component.ts
// imports here...
@Component({
// ...
})
export class MyComponent {
constructor(private _userService: UserService) { }
getUsers() {
this._userService.getUsers().then(users => console.log(users));
}
}
あなたのケースでは、代わりにユーザーのインターフェイスを使用する方が便利かもしれません。
export interface User {
id: number;
name?: string; // interfaces allow fields to be optional
}
オブジェクトの「形状」を定義する場合はインターフェースを使用し、動作(メソッド)を追加する必要がある場合はクラスを使用します。必要なのは、データを移動することだけであれば、インターフェイスを使用します。
クラスが必要な場合は、Usersのインスタンスを作成するための構文がmock-users.ts
少し異なります。まず、TypeScriptには「オプションのクラスフィールド」はありません。どのフィールドも設定/「未定義」できないため、フィールドをオプションとしてマークしても意味がありません。new
キーワードを使用してクラスをインスタンス化できます。欠点は、フィールド値を設定するか、インスタンスを変数に割り当ててフィールドを設定するコンストラクターを作成する必要があることです。しかし、特にテストオブジェクトの場合、新しいキーワードを使用しても何も問題はありません。
実行したように、オブジェクトリテラルを使用してオブジェクトをインスタンス化することもできますmock-users.ts
。キャストを追加して、より明示的にする必要があります。
export var USERS: User[] = [
<User> { // explicit cast to let the TypeScript compiler know you know what you're doing
id: 1
// no name (I wanted it to be optional for user with id 1)
},
{
id: 2,
name: "User 2"
},
]
キャストがない場合、TypeScriptコンパイラはエラーを生成します。これは、間違いを見つけるための仕様です。(興味深い)理由について詳しく知りたい場合は、型チェックの背後にあるいくつかの考え方について、関連する詳細な議論を以下に示します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加