【问题标题】:How to create a function with return types in TypeScript?如何在 TypeScript 中创建具有返回类型的函数?
【发布时间】:2017-11-02 01:26:43
【问题描述】:

我正在为我的 Web 应用程序使用 Aurelia 和 TypeScript。 我创建了以下“user_checking”函数来检查用户和状态,如下所示。

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

这个函数有两个参数和一个返回类型。我在那里看不到任何错误。但是当我运行应用程序时,我收到以下错误。

错误 TS2363:算术运算的右侧必须是“任意”、“数字”或枚举类型。 [07:46:58] gulp-notify:[错误运行 Gulp] 错误:

谁能告诉我这个函数有什么错误。

【问题讨论】:

  • 你必须为方法声明一个返回类型(number
  • @AndrewLi 你能告诉我我该怎么做吗?
  • user_checking(registerdata, tested_users): number { ... }
  • 我补充说。但是同样的错误兄弟:(
  • @AndrewLi 有什么想法吗?

标签: javascript typescript


【解决方案1】:

实际上,正如 cmets 中所提到的,您的代码 sn-p 在使用 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 的任何可能的类型不匹配
  • 将输入参数限制为强类型

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

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2021-01-03
    • 2012-08-18
    • 2018-11-11
    • 2019-12-29
    • 2021-05-28
    相关资源
    最近更新 更多