typescript:类型“字符串”不可分配给类型“数字”| Date::toLocaleDateString() 中的“2 位”

我最近在以下代码段中收到 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的错误吗?一旦编译,代码似乎工作正常(并且一直工作正常) - 根据 Date::toLocaleDateString() 的 documentation ,我在这里所做的似乎完全有效。

有任何想法吗?

stack overflow Typescript: Type 'string' is not assignable to type '"numeric" | "2-digit"' in Date::toLocaleDateString()
原文答案
author avatar

接受的答案

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

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

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

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

答案:

作者头像

我刚刚遇到了同样的问题,而不是将 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));
  }
作者头像

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

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));

相关问题