TypeScript命名元组-目标需要1个元素,但源可能更少.(2345)



我正试图利用命名元组(在本例中为AnniversaryPropertyConfig(来描述以下简化代码中的函数参数。

interface AnniversaryParameters {
value?: 'date-and-or-time' | 'text';
altid?: number | string;
calscale?: 'gregorian';
}
type AnniversaryPropertyConfig = [value: string, parameters?: AnniversaryParameters];
function main(config: AnniversaryPropertyConfig) {
return config;
}
const config = ['19960415', { value: 'text' as const }];
main(config);

然而,我一直收到以下错误:;目标需要1个元素,但源可能需要更少的元素。(2345(";我曾尝试将as const断言应用于config数组及其值,但没有成功。如果我将config变量类型转换为AnniversaryPropertyConfig类型,错误就会消失。但我觉得TypeScript应该能够在没有帮助的情况下推断出这一点。

可在此处找到适用TypeScript游乐场的链接以供参考。

您的问题是将AnniversaryPropertyConfig定义为元组:[value: string, parameters?: AnniversaryParameters]

数组从来不会被推断为元组,因此您必须显式断言类型。

interface AnniversaryParameters {
value?: 'date-and-or-time' | 'text';
altid?: number | string;
calscale?: 'gregorian';
}
type AnniversaryPropertyConfig = [value: string, parameters?: AnniversaryParameters];
function main(config: AnniversaryPropertyConfig) {
return config;
}
const config: AnniversaryPropertyConfig = ['19960415', { value: 'text' }];
main(config);

帮自己一个忙,尽量避免像myVar as MyType这样的类型断言。这从来都不是个好主意。

我发现消除错误的唯一方法是这样做:

const config = ['19960415', { value: 'text' }] as AnniversaryPropertyConfig;

const config: AnniversaryPropertyConfig = ['19960415', { value: 'text' }];

根据我的猜测,TypeScript的类型推断将['19960415', { value: 'text' }]视为一个数组,该数组可以在数组中的任何位置具有字符串,或者在数组中任何位置具有与{ value: 'text' }匹配的对象。因此,推断的类型对数组元素没有任何强制顺序,这使得它的类型过于宽泛,无法自动与AnniversaryPropertyConfig一致。

最新更新