在教程Extract parameter types from string literal types with TypeScript中有一个有趣的问题没有答案。
function calculate(operation, data) {
if (operation === 'add') {
return data.addend_1 + data.addend_2;
} else if (operation === 'divide') {
return data.dividend / data.divisor;
}
}
calculate('add', { addend_1: 1, addend_2: 2 });
calculate('divide', { dividend: 42, divisor: 7 });
如何定义这样一个函数的类型?
1条答案
按热度按时间umuewwlo1#
一种方法是将
operation
参数表示为一个区分联合体的 discriminant 属性,它可以帮助您缩小data
的表观类型。实际上,如果您将operation
和data
打包在一个对象中,而不是作为单独的参数,那么对于区分联合体来说,这将是一个简单的任务:TypeScript 4.6引入了对反结构区分并集的支持,因此您可以将rest parameter的元组类型表示为一个区分并集,并将其反结构化为单独的参数,如下所示:
Playground代码链接