Вы можете использовать перегрузки, как предполагает TJ Crowder, и это, вероятно, лучшее решение, если у вас всего несколько интерфейсов, так как написать простое понимание просто.
Более общим решением было бы использование условного типа Extract
для извлечения типа на основе строки, переданной в:
interface test1 { type: 'test1' }
interface test2 { type: 'test2' }
type unType = test1 | test2;
function whichType<K extends unType['type']>(typeValue: K): Extract<unType, {type: K}> {
return null!;
}
const tt1 = whichType('test1'); // test1
const tt2 = whichType('test2'); // test2
Решение, которое будет работать для любого объединения, может быть построено, но оно требует использования функции каррирования, потому что машинопись не поддерживает частичный вывод параметров типа:
function whichType<T extends { type: string}>() {
return function <K extends T['type']>(typeValue: K): Extract<T, {type: K}> {
return null!;
}
}
const tt1 = whichType<unType>()('test1'); // test1
const tt2 = whichType<unType>()('test2'); // test2