2017-01-16 35 views
3

gulpを使用して次のTypeScriptコードをコンパイルすると、エラーが表示されます。エラーTS2339:プロパティ 'accessToken'がタイプ 'Response'に存在しません。 Visual Studio 2015のErrorListウィンドウは、data.accessTokendata.expiryDateの同じエラーを報告します。変数dataを参照する2行をコメントアウトすると、コードが実行され、デバッガはdataがタイプ '応答'ではないことを示し、実際にはdata.accessTokendata.expiryDateのプロパティを含んでいます。 Visual Studioでは、data変数の上にマウスを置くと、dataのタイプがanyであることをツールチップが正しく報告します。TypeScriptエラーTS2339、しかしプロパティが存在する

なぜTypeScriptがこれを正確に翻訳できないのですが、どのようにして問題を解決できますか? TypeScriptがResponseのタイプdataで、タイプがanyでないと思うのはなぜですか? 私はTypeScript 2.1.4を使用しています。 http.fetchはオーレリアを使用しているここでは、クライアントdocumented here

/// <reference path="../typings/index.d.ts" /> 
import 'fetch'; 
import {HttpClient, json} from 'aurelia-fetch-client'; 
import {inject} from 'aurelia-framework'; 
import {BearerToken} from './common/bearer-token'; 
export class ApiToken 
{ 
... 
    public refreshToken(): Promise<BearerToken> 
    { 
     let token: BearerToken = new BearerToken(); 
     token.accessToken = "no_data"; 
     token.expiryDate = Date.now(); 

     return this.http.fetch('/Account/getToken') 
      .then(response => response.json()) 
      .then(data => 
      {     
       console.log('ApiToken.refreshToken returned data: ' + data); 

       // The next two lines cause build errors. 
       // When commented out the code runs and the debugger shows that 
       // data.accessToken and data.expiryDate do exist on data. 
       token.accessToken = data.accessToken; 
       token.expiryDate = data.expiryDate;   

       return token; 
      }) 
      .then((t) => { return this.saveToken(t) }); 
    } 
... 
} 

は私tsconfig.jsonファイルですフェッチ:

{ 
    "compileOnSave": false, 
    "compilerOptions": { 
    "rootDir": "src", 
    "outDir": "dist", 
    "sourceMap": true, 
    "target": "es5", 
    "module": "amd", 
    "declaration": false, 
    "noImplicitAny": false, 
    "removeComments": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "moduleResolution": "node", 
    "lib": ["es2015", "dom"], 
    "baseUrl": "./", 
    "paths": { 
     "src/*": ["src/*"] 
    } 
    }, 
    "filesGlob": [ 
    "./src/**/*.ts", 
    "./test/**/*.ts", 
    "./typings/index.d.ts", 
    "./custom_typings/**/*.d.ts", 
    "./jspm_packages/**/*.d.ts" 
    ], 
    "exclude": [ 
    "node_modules", 
    "jspm_packages", 
    "dist", 
    "build", 
    "test" 

    ], 
    "atom": { 
    "rewriteTsconfig": false 
    } 
} 

、私は次のようにdataのタイプを指定しようとしたが、それは問題を解決しませんでした

interface TokenResult 
{ 
    accessToken: string; 
    expiryDate: string; 
}  

.... 

public refreshToken(): Promise<BearerToken> 
{ 
    let token: BearerToken = new BearerToken(); 
    token.accessToken = "no_data"; 
    token.expiryDate = new Date(Date.now().toString()); 

    return this.http.fetch('/Account/getToken') 
     .then(response => response.json()) 
     .then((data: TokenResult) => 
     {     
      console.log('ApiToken.refreshToken returned data: ' + data); 

      token.accessToken = data.accessToken; 
      token.expiryDate = new Date(data.expiryDate); 

      return token; 
     }) 
     .then((t) => { return this.saveToken(t) }); 
} 

、エラーがあった:エラーメッセージが異なっていたが、両方とも以下に示す

error TS2345: Argument of type '(data: TokenResult) => BearerToken' is not assignable to parameter of type '(value: Response) => BearerToken | PromiseLike<BearerToken>'. 
    Types of parameters 'data' and 'value' are incompatible. 
    Type 'Response' is not assignable to type 'TokenResult'. 
     Property 'accessToken' is missing in type 'Response'. 

答えて

5

私はgitterの投稿者からこの回答を見つけました。 anyへのキャスト、そしてTokenResultへのキャストは、次のようにトリックをしました...

return this.http.fetch('/Account/getToken') 
    .then(response => response.json()) 
    .then((data: any) => 
    { 
     console.log('ApiToken.refreshToken returned data: ' + data); 

     token.accessToken = (<TokenResult>data).accessToken; 
     token.expiryDate = (<TokenResult>data).expiryDate; 

     return token; 
    }) 
    .then((t) => { return this.saveToken(t) }); 
+0

同じ問題がありました。宣言(データ:any)が私たちのためにトリックを行いました。私たちの場合、さらにキャスティングする必要はありませんでした – eMBee

関連する問題