Typescript создать копию объекта со всеми ключевыми свойствами, но различного типа - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть вопрос относительно типов, которые мне нужно использовать для получения следующего:

type keys = "foo" | "bar";

type Type1 = Record<keys, number>;
// Using `keyof Type1` just in case :)
type Type2 = Record<keyof Type1, boolean>;

// Created somewhere, we just have this
const foo: Type1 = {
  foo: 0,
  bar: 3
};

// How do I create a `Type2` object without manually specifying all the props?
// Given that I have all the needed keys in foo?
const bar: Type2 = ???

Я уже пробовал пару раз с Object.assign и объект распространялся без какого-либо результата.

// `number` not assignable to boolean
const bar: Type2 = { ...foo }; // not working
const bar: Type2 = Object.assign({}, foo); // not working
// Not working as expected, type is `Type1 & Type2`
const bar = Object.assign({} as Type2, foo); // not working
// Working but a bit ugly no?
const bar: Type2 = Object.assign({} as Type2, foo); // Working

Реализация должна быть внутри функции, которая отображается от Type1 до Type2, например:

const foonction = (obj: Type1): Type2 => {
  // create object and map values
}

1 Ответ

0 голосов
/ 30 апреля 2019

Type2 уже имеет те же ключи, что и Type1, поэтому все, что вам нужно сделать, это отобразить свойства, которые являются частью объектов, а не типов. Так что ваш foonction может выглядеть так

const foonction = (obj: Type1): Type2 => {
    let res = <Type2>{}; 
    Object.keys(obj).forEach(key => res[key as keyof Type2] = obj[key as keyof Type1] != 0);  // Do your mapping here
    return res;
}

Object.assign даст результат типа Type1 & Type2 ( тип пересечения ). Таким образом, вы не будете выполнять сопоставление, у вас будет объект bar, содержащий те же свойства того же типа, что и foo.

...