打字稿:类型 'string' 不能分配给类型 '"numeric" | Date::toLocaleDateString() 中的 "2-digit"'

Esk*_*kir 5 javascript date typescript

我最近在以下代码段中收到 Visual Studio Code 的“错误”警报:

someDateObject.toLocaleDateString('de-DE', Travel.dateOptions));
someDateObject.toLocaleDateString('de-DE', Travel.dateOptions));
Run Code Online (Sandbox Code Playgroud)

Travel.dateOptions 的定义如下:

public static dateOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };
Run Code Online (Sandbox Code Playgroud)

这在过去 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)
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么。这可能是 VSC 的错误吗?一旦编译,代码似乎运行良好(并且一直运行良好) - 根据Date::toLocaleDateString()的文档,我在这里所做的似乎完全有效。

有任何想法吗?

小智 36

我刚刚遇到了同样的问题,我没有将 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));
  }
Run Code Online (Sandbox Code Playgroud)


Laz*_*vić 25

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

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

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

public static dateOptions = { year: 'numeric', month: '2-digit', day: '2-digit' } as const;
Run Code Online (Sandbox Code Playgroud)


Mat*_*iao 20

按照您的代码示例,您必须显式声明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));
Run Code Online (Sandbox Code Playgroud)


小智 7

包括Intl.DateTimeFormatOptions用于声明。

const options :Intl.DateTimeFormatOptions = { 
    year: 'numeric', 
    month: '2-digit', 
    day: 'numeric', 
    hour: '2-digit', 
    minute: '2-digit', 
    hour12: false 
};
Run Code Online (Sandbox Code Playgroud)