Удалить свойства типа из другого типа - PullRequest
0 голосов
/ 13 июня 2018

Этот вопрос похож, но немного отличается от Typescript 2.8: удаление свойств одного типа из другого

Я хотел бы создать функцию, которая принимает тип и возвращаетНовый тип, который не включает в себя свойства типа Array или других сложных (вложенных) объектов.

Я предполагаю, что условные типы - лучший (только?) способ справиться с этим?Как это можно сделать?

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете создать условный тип, который сохранил только примитивные типы (исключая массивы и другие объекты), используя условные типы (для выбора ключей) и Pick

type PrimitiveKeys<T> = {
    [P in keyof T]: Exclude<T[P], undefined> extends object ? never : P
}[keyof T];
type OnlyPrimitives<T> = Pick<T, PrimitiveKeys<T>>

interface Foo {
    n: number;
    s: string;
    arr: number[];
    complex: {
        n: number;
        s: string;
    }
} 

let d : OnlyPrimitives<Foo> // will be { n: number, s: string }

Реальная реализация функции должна бытьдовольно просто, просто итерируйте свойства объекта и исключите object

function onlyPrimitives<T>(obj: T) : OnlyPrimitives<T>{
    let result: any = {};
    for (let prop in obj) {
        if (typeof obj[prop] !== 'object' && typeof obj[prop] !== 'function') {
            result[prop] = obj[prop]
        }
    }
    return result;
}

let foo = onlyPrimitives({ n: 10, s: "", arr: [] }) ;

Edit Добавлена ​​корректная обработка для необязательных полей.

...