2017-06-01 124 views
0

我为我的web应用程序使用Aurelia和TypeScript。 我创建了以下'user_checking'函数来检查用户和状态,如下所示。如何在TypeScript中使用返回类型创建函数?

user_checking(registerdata, tested_users) { 
    return registerdata.userid && typeof tested_users[registerdata.userid] == 'undefined'; 
} 

该函数有两个参数,也是一个返回类型。我没有看到任何一种错误。但是当我运行该应用程序时,出现以下错误。

error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type. [07:46:58] gulp-notify: [Error running Gulp] Error:

谁能告诉我什么在这个函数中的错误。

+1

您必须为方法 – Li357

+0

@AndrewLi能否请你告诉我,我怎么能做到这一点声明返回类型('number')? –

+0

'user_checking(registerdata,tested_users):number {...}' – Li357

回答

0

实际上,正如评论中提到的,当使用TypeScript v2.3.x进行编译时,您的代码片段可以正常工作。

您可能首先需要通过tsc --v来检查TypeScript版本,并根据需要进行更新。

我已经采取了你提到的snippet from GitLab,并测试它是否按预期工作。下面的两个基本的例子安排并同时返回“真”与“假”:

/** 
* Example that arranges the function to return 'true' 
*/ 
public exampleTrue(): boolean { 
    let registerdata = { userid: 1001 }; 
    let tested_users = []; 

    return this.register.user_checking(registerdata, tested_users); 
} 

/** 
* Example that arranges the function to return 'false' 
*/ 
public exampleFalse(): boolean { 
    let registerdata = { userid: 1001 }; 
    let tested_users = []; 

    this.tested_users[registerdata.userid] = 'foo'; 

    return this.register.user_checking(registerdata, this.tested_users); 
} 

为了记录在案,这里是你的类不做任何修改

import {autoinject} from 'aurelia-framework'; 
import {HttpClient, json} from 'aurelia-fetch-client'; 

@autoinject 
export class Register { 
    heading:string = 'sTeam register'; 

    registerdata = {}; 
    passwordmatch = true; 
    tested_users = {}; //in coffee this is 'tested_users = {}' 

    /** 
    * CoffeeScript(AngularJS based) code as follows. 
    * ------------------------------ 
    * S.tested_users =() -> 
    *  tested_users 
    * ------------------------------ 
    * @param tested_users 
    * @returns {any} 
    */ 
    tested_users_check(tested_users) { 
    return tested_users; 
    } 

    /** 
    * CoffeeScript(AngularJS based) code as follows. 
    * ------------------------------ 
    * S.user_checking = -> 
    *  S.registerdata.userid and typeof tested_users[S.registerdata.userid] == 'undefined' 
    * ------------------------------ 
    * @param registerdata 
    * @param tested_users 
    * @returns {number} 
    */ 
    user_checking(registerdata, tested_users) { 
    return registerdata.userid && typeof tested_users[registerdata.userid] == 'undefined'; 
    } 

    /** 
    * CoffeeScript(AngularJS based) code as follows. 
    * ------------------------------ 
    * S.user_available = -> 
    *  typeof tested_users[S.registerdata.userid] != 'undefined' and !tested_users[S.registerdata.userid] 
    * ------------------------------ 
    * @param registerdata 
    * @param tested_users 
    */ 
    user_available(registerdata, tested_users) { 
    typeof tested_users[registerdata.userid] != 'undefined' && !tested_users[registerdata.userid]; 
    } 

    /** 
    * CoffeeScript(AngularJS based) code as follows. 
    * ------------------------------ 
    * S.user_taken = -> 
    *  typeof tested_users[S.registerdata.userid] != 'undefined' and tested_users[S.registerdata.userid] 
    * ------------------------------ 
    * @param registerdata 
    * @param tested_users 
    */ 
    user_taken(registerdata, tested_users) { 
    typeof tested_users[registerdata.userid] != 'undefined' && tested_users[registerdata.userid]; 
    } 

    /** 
    * CoffeeScript(AngularJS based) code as follows. 
    * ------------------------------ 
    * S.register = -> 
    *  S.registerdata.group = 'techgrind' 
    *  steam.post('register', S.registerdata).then(handle_request) 
    * ------------------------------ 
    * @param registerdata 
    */ 
    register(registerdata) { 
    registerdata.group = 'kaishr'; 
    // Have to implement the steam post method call. 
    } 

} 

一点题外话我想要指出的是,利用TypeScript的强类型可能会非常有帮助。你的课程几乎不使用任何约束和类型声明。但也许,作为一个起点,你可能会得到一些小的调整,如:

// define a strong-typed array, constrained to numbers 
    // (assuming userid is a number) 
    tested_users: Array<number> = []; 

    // define the class 'RegisterData' 
    // forcing it to have a userid of type number 
    export class RegisterData { 
    public userid: number; 
    } 

有了这个地方,你可以重构你的操作更有点走编译时的安全性和检查的充分利用,在你面前甚至运行你的应用程序像这样:

public user_checking(registerdata: RegisterData, tested_users: Array<number>): boolean { 
    return registerdata.userid && typeof tested_users[registerdata.userid] == 'undefined'; 
    } 

不要被咋一看,在仪式上看起来像很多开销。只有加入某些类型的,你已经做了以下内容:

  • 强迫你的函数返回boolean
  • 强类型的RegisterData类
  • 淘汰任何可能的类型不匹配的userid
  • 约束输入参数到强类型

最终,这将使您的编译器在您运行程序之前帮助您提供更好的信息。

希望这有助于...

相关问题