TypeScript предоставляет значения по умолчанию для отсутствующих ключей типа - PullRequest
2 голосов
/ 17 июня 2020

Там может быть невероятно очевидный ответ, но как сделать следующее:

type testStatus = {
    foo: boolean;
    bar: boolean;
    baz: boolean;
}

const makeDefaults = (o: Partial<testStatus>) => {
   const keys = // array of `testStatus` keys?
   keys.forEach(k => !(k in o) && (o[k] = false)) // provide a default value for missing keys
   return o
}

const obj: Partial<testStatus> = { foo: true, bar: false } 

const defaultedObj = makeDefaults(obj) // { foo: true, bar: false, baz: false }

В основном получить все ключи от типа до l oop через?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

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

const KEYS = ['foo', 'bar', 'baz'] as const;

type testStatus = { [K in typeof KEYS[number]]: boolean };

const makeDefaults = (o: Partial<testStatus>) => {
    KEYS.forEach(k => !(k in o) && (o[k] = false))
    return o
}

Playground

1 голос
/ 17 июня 2020

Типы существуют только во время компиляции, поэтому то, что вы пытаетесь сделать, невозможно.

Более простой альтернативой может быть что-то вроде

type TestStatus = {
    foo: boolean;
    bar: boolean;
    baz: boolean;
}

const defaultTestStatus: TestStatus = {
    foo: false,
    bar: false,
    baz: false
}


const merge = (partialStatus: Partial<TestStatus>): TestStatus => ({
    ...defaultTestStatus,
    ...partialStatus
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...