【问题标题】:Apply an interface in Typescript在 Typescript 中应用接口
【发布时间】:2021-06-12 09:29:03
【问题描述】:

我正在使用Node JSTypescript 创建一个项目,我有一个类和一个接口,我可以在其中键入所有数据。我需要知道的是如何将它应用到课堂上。

这是我的interface

export interface IController {
    url: string,
    api: string
}

这是我的class,我想在其中应用它:

import { Request, Response } from 'express';
import { constUtils } from '../utils/const.utils';
import { IController } from '../utils/model.utils';
import { utilsController } from '../utils/index.utils';

class IndexController {

    public async index(req: Request, res: Response): Promise<IController> {

        try {
            let api = req.query.api;
            let constUt = new constUtils();
            let url = constUt.conf.API_MOCS[`${api}`].url;
            await utilsController.utilsCsvConverter(api, url);         
        } catch (error) {
            console.log(error);
        }
    }
}
export const indexController = new IndexController();

【问题讨论】:

  • 您需要更具体。您究竟想在哪里应用接口?直接到IndexController 类还是作为index() 函数返回的东西?
  • @Phoenix1355 直接在index()进行数据输入
  • 在包含IndexController的文件中导入csvModel接口,然后给index()方法一个返回类型——假设你试图从方法中返回一个csvModel:@ 987654334@
  • @j1mbl3s 更新了问题。例如,我可以返回带有接口数据的res.json 消息吗?或者我应该如何返回以及解决以下问题的价值?:A function whose declared type is neither 'void' nor 'any' must return a value

标签: node.js typescript refactoring


【解决方案1】:

这假定局部变量 urlapi 应在 Promise 中返回,解析为由 IController 接口指定的对象:

import { Request, Response } from 'express';
import { constUtils } from '../utils/const.utils';
import { IController } from '../utils/model.utils';
import { utilsController } from '../utils/index.utils';

class IndexController {
    public async index(req: Request, res: Response): Promise<IController> {

        try {
            let api = req.query.api;
            let constUt = new constUtils();
            let url = constUt.conf.API_MOCS[`${api}`].url;
            await utilsController.utilsCsvConverter(api, url);
            return {url, api};         
        } catch (error) {
            console.log(error);
        }
    }
}
export const indexController = new IndexController();

【讨论】:

  • 我正在使用接口进行数据输入,我从 Typescript 开始,我想要尽可能地重构项目。在这种情况下,没有输入数据,Promise &lt;IController&gt; 显示以下错误:A function whose declared type is neither 'void' nor 'any' must return a value
  • 我不确定方法索引应该做什么,但它似乎没有返回任何东西,实际上也没有异步函数调用,所以你可以在没有 async 的情况下定义它给它一个返回类型void
  • 我想知道的是在Typescript中初始化变量并输入它们的最佳方法,从我读过的内容来看是使用接口但我不知道如何应用它们。
  • 就在您提到您收到返回类型错误之前,我回答了如何处理此错误。如果不了解您要初始化和键入哪些变量,就很难提供帮助。我的猜测是基于您的变量名称,在我看来,好像您指的是urlapi。我还是不知道你可能想用这个界面做什么?如果你只想初始化一个变量,这可以隐式地完成let url = ''; 或显式地let url: string = '';typescriptlang.org/docs/handbook/2/everyday-types.html
  • 之前的初始化还是值得的,我会好好学习Interfaces的使用。另一方面,我如何返回 Promise 以使其返回变量并将它们显示为 json,使用 res.json 但将其应用于 Promise 是否可能?如果不是,如何返回 Promise?
【解决方案2】:

如果你想使用或应用接口到类,你应该在应用的类中implement。下面的代码可能会给你一个清晰的想法。

class IndexController implements csvModel {
    url: string;
    api: string;

    public async index(req: Request, res: Response): Promise<IController> {

        try {
            this.api = req.query.api;
            let constUt = new constUtils();
            this.url = constUt.conf.API_MOCS[`${api}`].url;           
        } catch (error) {
            console.log(error);
        }
    }
}
export const indexController = new IndexController();

【讨论】:

  • 这和以前一样,它让我在 Promise 中失败:声明类型既不是 'void' 也不是 'any' 的函数必须返回一个值
  • 你必须从 try 和 catch 块中返回一些东西,因为它不是一个 void 函数,你的返回类型是 Promise&lt;IController&gt; 或者删除这个 Promise&lt;IController&gt;return {} 空对象
  • 将IndexController实现为csvModel的原因是什么?
  • 它将使用接口对apiurl的值进行类型转换。在场景中也可能有所帮助:export const csvModel = new IndexController(); csvModel.api
  • 对不起,但我仍然不明白在这种情况下使用接口是否更好,以及如何初始化它们以便以后使用它们
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2021-05-05
  • 2019-06-08
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多