【问题标题】:Typescript date validation format打字稿日期验证格式
【发布时间】:2021-06-16 08:17:41
【问题描述】:

我正在为我的应用程序使用 Typescript。我在数据库中有两组数据,一组是date,一组是time。两者都期待字符串。

当用户选择日期时,我发出了一个POST 请求,并且将为用户选择那个时间。我为用户的选择时间结束创建了一个辅助函数,在这种情况下,我会在前端向他们显示一个警报,显示

“您选择的时间已过期!”

我的逻辑工作正常,但我正试图摆脱 Typescript 错误。

这是我的Typescript playground error:

找不到名称“要求”。您需要为节点安装类型定义吗?试试npm i --save-dev @types/node。

“字符串”类型的参数不能分配给“数字”类型的参数。

算术运算的左侧必须是“any”、“number”、“bigint”或枚举类型。

“字符串”类型的参数不能分配给“数字”类型的参数。

对象可能是“空”。

这是我的代码

const { isToday, format } = require("date-fns");

const expiredTime = (date: string, time: string) => {
  const [yyyy, mm, dd] = date.split("-");
  const d = new Date();
  d.setFullYear(yyyy);
  d.setMonth(mm - 1);
  d.setDate(dd);
  if (isToday(d)) {
    const now = d.toTimeString().match(/(\d{2}:\d{2}):.*/)[1];
    const [start, end] = time.split("-");

    return now >= start && now <= end;
  }
  return false;
};

const text = expiredTime("2021-06-16", "10:55-12:00") ? "OK" : "Expired";
console.log(text);

【问题讨论】:

  • 能否在您的问题中说明实际错误是什么?
  • 这里实际上没有任何打字稿。您需要添加类型(因此得名)
  • 可以使用parseInt()函数将字符串解析为整数。

标签: javascript typescript date


【解决方案1】:
  1. 你应该将yyyy、mm、dd解析成数字;
  2. 正则表达式的结果可以为空;

你的代码应该是

const { isToday, format } = require("date-fns");

const expiredTime = (date: string, time: string) => {
  const [yyyy, mm, dd] = date.split("-").map(parseInt);
  const d = new Date();
  d.setFullYear(yyyy);
  d.setMonth(mm - 1);
  d.setDate(dd);
  if (isToday(d)) {
    const matched = d.toTimeString().match(/(\d{2}:\d{2}):.*/);
    if (!matched){
      console.log("invalid date");
      return false;
    }
    const now = matched[1];
    const [start, end] = time.split("-");

    return now >= start && now <= end;
  }
  return false;
};

const text = expiredTime("2021-06-16", "10:55-12:00") ? "OK" : "Expired";
console.log(text);

【讨论】:

    【解决方案2】:

    您发布的 Typescript 不完整。

    • 注意处理Object is possibly 'null'错误的可选链
    • 使用一元 + 运算符转换为数字 - 将映射保存到 parseInt,TS 在日期构造函数中需要整数。
    • 告诉 TS 你正在使用拆分的字符串数组

    最后我更改了创建日期。单独设置零件效率不高。它是在我还没有完全掌握你的规格时完成的

    const { isToday, format } = require("date-fns");
    
    const expiredTime = (date: string, time: string) => {
      const [yyyy, mm, dd]: Array<string> = date.split("-");
      const d: Date = new Date(+yyyy, +mm - 1, +dd);
      if (isToday(d)) {
        const now = d?.toTimeString()?.match(/(\d{2}:\d{2}):.*/)?.[1];
        if (now) {
          const [start, end] = time.split("-");
          return now >= start && now <= end;
        }
        return false;
      }
      return false;
    };
    
    const text = expiredTime("2021-06-16", "10:55-12:00") ? "OK" : "Expired";
    console.log(text);
    

    【讨论】:

      【解决方案3】:

      为什么它接受作为答案??它没有给出任何时间输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        相关资源
        最近更新 更多