首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript错误为TS2339,但属性确实存在

TypeScript错误为TS2339,但属性确实存在
EN

Stack Overflow用户
提问于 2017-01-16 20:06:57
回答 1查看 2.6K关注 0票数 2

当我使用gulp编译以下响应代码时,我得到了: error Response:属性'accessToken‘在类型’TS2339‘上不存在。Visual Studio2015中的ErrorList窗口为data.accessTokendata.expiryDate报告了相同的错误。当我注释掉引用变量data的两行代码时,代码运行,调试器显示data不是'Response‘类型,而实际上包含属性data.accessTokendata.expiryDate。在Visual Studio中,当我将鼠标悬停在data变量上时,工具提示正确地报告data的类型为any

为什么TypeScript不能正确地转换它,我该如何解决这个问题?为什么TypeScript认为dataResponse类型而不是any类型?我使用的是TypeScript 2.1.4。http.fetch正在使用aurelia fetch客户端documented here

代码语言:javascript
复制
/// <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文件:

代码语言:javascript
复制
{
  "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的类型,但没有解决问题,尽管错误消息不同,两者如下所示:

代码语言:javascript
复制
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) });
}

错误是:

代码语言:javascript
复制
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'.
EN

回答 1

Stack Overflow用户

发布于 2017-01-17 23:43:33

我从gitter上的一个贡献者那里找到了一个答案。先对any进行强制转换,然后对TokenResult进行强制转换,如下所示...

代码语言:javascript
复制
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) });
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41676095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档