【问题标题】:Typescript: Type 'string' is not assignable to type '"numeric" | "2-digit"' in Date::toLocaleDateString()打字稿:类型“字符串”不可分配给类型“数字”| Date::toLocaleDateString() 中的“2 位”
【发布时间】:2021-06-09 22:15:32
【问题描述】:

我最近在以下 sn-p 中收到 Visual Studio Code 的“错误”警告:

someDateObject.toLocaleDateString('de-DE', Travel.dateOptions));
someDateObject.toLocaleDateString('de-DE', Travel.dateOptions));

Travel.dateOptions 的定义如下:

public static dateOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };

在过去 2 年的大部分时间里,这一直运行良好,但最近在 VSC 中打开课程时,它显示Travel.dateOptions 的以下错误:

Argument of type '{ year: string; month: string; day: string; }' is not assignable to parameter of 
type 'DateTimeFormatOptions'.
Types of property 'year' are incompatible.
Type 'string' is not assignable to type '"numeric" | "2-digit"'. ts(2345)

我完全不知道为什么。这可能是VSC的错误吗?代码在编译后似乎运行良好(并且一直运行良好) - 根据 documentation for Date::toLocaleDateString() 我在这里所做的似乎完全有效。

有什么想法吗?

【问题讨论】:

    标签: javascript typescript date


    【解决方案1】:

    当您使用诸如public foo = { bar: 'a' } 之类的文字初始化类属性时,即使您将其声明为readonly,它的类型也会变为{ bar: string }。 TypeScript 故意不会使类型过于严格 ({ bar: 'a' })。

    方法toLocaleDateString 接受一个对象,其键year 必须是'numeric''2-digit' 类型,但你的键是string 类型。

    要使初始化对象的类型更具体,请使用as const

    public static dateOptions = { year: 'numeric', month: '2-digit', day: '2-digit' } as const;
    

    【讨论】:

      【解决方案2】:

      我刚刚遇到了同样的问题,我没有将 const 重新声明为 const(感觉像代码味道),而是强制变量类型:

        formatDT(sourceDate: Date) {
          const options: Intl.DateTimeFormatOptions = { month: "long", day: 'numeric', year: 'numeric', hour: '2-digit', minute: "2-digit" };
          return new Intl.DateTimeFormat("en-GB", options).format(new Date(sourceDate));
        }
      

      【讨论】:

      • 这更有意义,它对我有用。
      【解决方案3】:

      在您的代码示例之后,您必须为 dateOptions 显式声明 DateTimeFormatOptions 数据类型

      const dateOptions: Intl.DateTimeFormatOptions = {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      };
      
      export const Travel = { dateOptions };
      
      const someDateObject = new Date();
      
      console.log(someDateObject.toLocaleDateString('de-DE', Travel.dateOptions));
      

      【讨论】:

        猜你喜欢
        • 2016-10-25
        • 2022-01-17
        • 2020-02-07
        • 2021-11-10
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        相关资源
        最近更新 更多