Я почти уверен, что это одно из тех мест, где вы должны прибегнуть к утверждению типа. В данном случае:
function parse<T extends Record<string, string>>(input: string): T {
const result: Record<string, string> = {};
// −−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^
input.split('&').forEach(bits => {
const [name, value] = bits.split('=');
result[name] = value;
});
return result as T;
// −−−−−−−−−−−−^^^^^
}
На игровой площадке
Однако важно понимать ограничения здесь. Если ваши типы Identity
или ContactDetails
имели определенные реализации c (в вашем примере их нет, они просто interface
s), возвращаемый объект parse
не будет поддерживаться этой реализацией. Это это просто Record<string, string>
. Так что вам может быть лучше, если вместо этого parse
вернет Record<string, string>
и предоставит вызывающей стороне возможность принять обоснованное решение о типе.