yuuka_maniaの日記: TypeScript async/await とメソッドチェーン 3
await を含む処理は、 async 関数としなければならい。で、 async 関数の戻り値は、ジェネリクスで Promise にしなければならない。
例えば、
export class HttpGet {
uri: string;
response: Response | undefined = undefined;
constructor(uri: string) {
this.uri = uri;
}
async do(): Promise<HttpGet> {
let ret = await fetch(this.uri, {
method: "GET",
});
this.response = ret;
return this;
}
}
な、クラスがあって、
let res = await new HttpGet("http://localhost:8080/").do().response;
なメソッドチェーンの書き方をすると、コンパイルできない。do() が返すのは、 Promise で、 HttpGet 型ではないから、 .response プロパティは存在しないと怒られる。
一方、以下は、コンパイルが通る。
let res = await new HttpGet("http://localhost:8080/").do()
consooe.log(res.response);
これ、どうにかして、1行のメソッドチェーンで書きたいと試行錯誤したところ、
let res = (await new HttpGet("http://localhost:8080/").do() as HttpGet).response;
型アサーションで書くと、期待する動作を確認できた。スッキリ!
キャストいる? (スコア:0)
awaitと.の結合順位の問題じゃないの?
これじゃだめ?
let res = (await new HttpGet("http://localhost:8080/").do()).response;
キャストいらない (スコア:0)
それでいいはず。むしろ型アサーションをつけるとTypeScriptの型推論を殺してしまうからつけるべきでない
Re:キャストいらない (スコア:1)
その通りでした。勉強になりました。m(_ _)m
gayazone