无法正确键入函数返回函数

Posted

技术标签:

【中文标题】无法正确键入函数返回函数【英文标题】:Cannot properly type function returns functions 【发布时间】:2019-03-25 04:09:01 【问题描述】:

我是 TypeScript 的初学者。我有一个函数,它返回一个包含两个函数的对象,就这么简单。我已经为它定义了一个返回接口,但是由于某种原因,当我尝试使用返回的接口之一时,我得到了

TS2339:类型 '() => get: (url: 字符串)=> 字符串 |空值;设置: ( url, body : SetItemInterface) => 空白; '。

代码如下:

import * as Express from "express";

interface StorageInterface 
  [url: string]: 
    body: string;
    date: number;
  ;


interface SetItemInterface 
  body: string;
  url: string;


interface ItemInterface 
  body: string;
  date: number;


interface CacheFunctionInterface 
  get(url: string): string | null;
  set(params: SetItemInterface): void;


const cache = (): CacheFunctionInterface => 
  const storage: StorageInterface = ;
  const cacheTime: number = 1000;

  /**
   * Creates or updates item in store.
   * @param string url
   * @param string body
   */
  const setItem = ( url, body : SetItemInterface): void => 
    storage.url = 
      body,
      date: Number(+new Date()) + cacheTime,
    ;
  ;

  /**
   * Gets the item if exists, otherwise null;
   * @param string url
   */
  const getItem = (url: string): string | null => 
    const item: ItemInterface = storage[url];
    const currentTime = +new Date();

    if (!!item) 
      if (item.date > currentTime) 
        return item.body;
      
    

    return null;
  ;

  return 
    get: getItem,
    set: setItem,
  ;
;

const cacheMiddleware = (req: Express.Request, res: Express.Response, next: Express.NextFunction) => 
  const  url :  url: string  = req;
  const item: string | null = cache.get(url); // Here's the problem

  if (!!item) 
    return res.send(item);
  

  return next();
;

export  cacheMiddleware ;
export default cache;

和the playground。

我该怎么办?

【问题讨论】:

【参考方案1】:

cache 是一个函数:

const cache = (): CacheFunctionInterface =>  ...

并且您通过尝试对其调用.get 方法将其视为对象。

cache.get(...

【讨论】:

天哪,你完全正确!这太简单了!非常感谢! 我会做出更有用/更详细的答案,但是您的代码不够集中(大量代码,不确定您的意图是什么),因此很难做到。 不,不,不,你的答案是完美的。我只是忘记了cache 是一个函数,我希望它是一个对象。调用它就可以让它全部工作。

以上是关于无法正确键入函数返回函数的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:如何正确键入一个接受承诺并按原样返回该承诺的函数

如何键入提示函数的可选返回参数? [复制]

BATCH - 无法从函数的变量中返回正确的值

keil C51中函数调用无法正确返回怎么回事

如何键入需要返回对象副本同时还更改其属性之一的类型的函数?

此函数为CameraPosition中的zoom参数返回null而不是正确的值,我无法弄明白