我正试图利用命名元组(在本例中为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
一致。