微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linter 抱怨不能在字符串上使用扩展运算符,这很好,但是在这种情况下如何避免它?

如何解决Linter 抱怨不能在字符串上使用扩展运算符,这很好,但是在这种情况下如何避免它?

当我将鼠标悬停在 VSCode 中的 ...res 上时,我收到了来自 linter 的警告:

传播类型只能从对象类型创建

当我记录 res 时,它要么是一个字符串,要么是一个对象。但是,我不知道在这种情况下如何满足 linter。

function getCookie(req: Request,key: string): string | undefined {
  const {
    headers: { cookie },} = req;

  return (
    cookie &&
    cookie.split(";").reduce<string | undefined>((res,item) => {
      const data = item.trim().split("=");

      return <string | undefined>{ ...res,[data[0]]: data[1] };
    },"")
  );
}

解决方法

那么让我们分别处理 JavaScript 和 TypeScript 方面。用简单的 JavaScript 术语来说,您的函数不会执行您所描述的操作。当定义了 cookie 时,它​​返回一个 Record<string,string> 将 cookie 名称映射到 cookie 值,而不是特定的字符串或 false。如果您想让它对 key 执行某些操作,那么您还没有在示例中包含该部分。

当没有定义 cookie 时,它​​应该返回 undefined,但是因为您在 return 语句中测试了真实性 cookies,它可能会返回一个空字符串。这可以通过单独进行该测试并显式返回 undefined 来解决。 (确保您的 linter 警告您在 TS 的布尔上下文中使用非布尔值。)

您传播字符串的原因是您将空字符串 "" 作为初始值传递给 Array.prototype.reduce。由于您正在累积对象,而不是字符串,因此您的初始值应该是 {}(一个空对象)。

这有助于我们了解 TypeScript 问题。一旦初始值被更正,你的 string | undefined 强制转换都是不必要的,并且函数整体的返回类型变为 Record<string,string> | undefined。总之:

function getCookie(req: Request,key: string): Record<string,string> | undefined {
    const {
        headers: { cookie },} = req;
    if (!cookie) {
        return undefined;
    }
    return cookie.split(";").reduce<Record<string,string>>((res,item) => {
        const data = item.trim().split("=");
        return { ...res,[data[0]]: data[1] };
    },{});
}

但是,如果您确实想查找特定的 key 并返回其值,则数组化简器不是最佳方法,您的函数看起来会大不相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。