ASK SDK(TypeScript)で任意の型のRequestオブジェクトを取得する

Pull Requestがマージ・リリースされたので簡単に紹介します。

Requirement

  • ask-sdk@2.8.0 or later
  • TypeScript

背景

ASK SDKでは、handlerInput.requestEnvelope.requestにインテント名やスロットといったスキルからのリクエスト内容が入ります。

が、このオブジェクトはUNION型で全てのリクエストタイプが指定されており、IntentRequestでスロットを取りたい時など、特定のリクエストにしかないプロパティを取得するにはキャストしてやる必要がありました。

GitHubでもMissing typescript definitions? #398というIssueが上がっており、「キャストしないとTypeScriptでエラーになる」ということに気づかないと、任意のRequestのプロパティを取得できなくなるという問題が出ていました。

ASK SDK@2.8.0で追加されたgetRequest

若干身もふたもないのですが、このキャストをGenericsでやる関数としてgetRequestがversion2.8.0から追加されました。

// For Intent request
const request = getRequest<IntentRequest>(handlerInput.requestEnvelope)
const state = request.dialogState

// For AudioPlayer intent request
const req = getRequest<interfaces.audioplayer.PlaybackFinishedRequest>(intentRequestEnvelope)
const sec = req.offsetInMilliseconds

canHandleでリクエストの選別が終わっている前提での利用になりますので、複数のRequestを受け付けているHandlerで使用すると予想外の動きがでることに注意してください。

asがGenericsに変わっただけ」といえばそれだけなのですが、あまりasを使いたくない派としてはgetRequestを積極的に使っていきたいなと思います。

PR出しておいて使わないのは流石に失礼かなとも思いますし・・・

Comment