Нет никакого способа сделать это только с определениями интерфейса, так как такие определения являются частью системы типов, которая стирается во время выполнения. Если вам нужно что-то сделать во время выполнения, вам нужно написать код, который делает это во время выполнения. В данном случае вот общая функция, которая извлекает только свойства объекта, соответствующего списку ключей:
function extract<T extends object, K extends keyof T>(
obj: T,
keys: K[]
): Pick<T, K> {
const ret = {} as Pick<T, K>;
keys.forEach(k => ret[k] = obj[k])
return ret;
}
А для вашего конкретного случая использования вы можете создать функцию преобразования, типы которой включают в себя RxInterface
и TxInterface
, но в которой в качестве значений указываются конкретные ключи, а не типы:
const rxToTx = (rx: RxInterface): TxInterface => // type annotation here
extract(rx, ["field1", "field2", "field3"]); // explicit key values here
И вы можете убедиться, что это работает:
const rx: RxInterface = {
field1: "yes",
field2: "yep",
field3: 100,
field4: "no",
field5: "nope"
}
const tx = rxToTx(rx);
console.log(tx);
// {field1: "yes", field2: "yep", field3: 100}
Надеюсь, это поможет; удачи!