Замораживание объектов литеральных типов объектов

45
4

Учитывая некоторый замороженный объект:

const obj = Object.freeze({a: 1, b:2});

это тип Readonly<{a:number, b:number}>, есть ли способ определить это так, чтобы Readonly<{a:1, b:2}> него был тип Readonly<{a:1, b:2}>, не прибегая к приведению?

Причина, по которой я этого хочу, заключается в том, что я хочу использовать типы значений, чтобы сузить ввод другой функции, например: function foo(input: 1 | 2)

спросил(а) 2019-03-09T20:42:00+03:00 9 месяцев назад
3
Решение
45

function l<T extends number>(p: T ): T { 
return p;
}
const c = { a: l(1), b: l(2) };
// const fc: Readonly<{ a: 1; b: 2; }>
const fc = Object.freeze(c);

или же

function lc<T extends number>(p: { [k: string]: T }) : { [k: string]: T } { 
return p;
}
// const t1: { [k: string]: 1 | 2 | 3; }
const t1 = lc({ a: 1, b: 2, c: 3 });

ответил(а) 2019-03-09T21:03:00+03:00 9 месяцев назад
Еще 2 ответа
31

В следующей версии TypeScript (3.4) вы сможете сделать:

const obj = Object.freeze({ a: 1, b: 2 } as const); // { radonly a: 1, readonly b: 2 }

ответил(а) 2019-03-09T22:39:00+03:00 9 месяцев назад
32

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

export function frozen(target: Function): void {
Object.freeze(target);
Object.freeze(target.prototype);
}

ответил(а) 2019-03-09T20:51:00+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема