Замораживание объектов литеральных типов объектов
60
5
Учитывая некоторый замороженный объект:
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
1 год, 10 месяцев назад
добавить комментарий
пожаловаться
Решение
60
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
1 год, 10 месяцев назад
добавить комментарий
пожаловаться
42
В следующей версии 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
1 год, 10 месяцев назад
добавить комментарий
пожаловаться
42
Если вы хотите сохранить неизменность значений, вы можете просто определить свой класс Readonly с помощью замороженного декоратора.
export function frozen(target: Function): void {
Object.freeze(target);
Object.freeze(target.prototype);
}
ответил(а)
2019-03-09T20:51:00+03:00
1 год, 10 месяцев назад
добавить комментарий
пожаловаться
Ваш ответ
- Вопросы
- Typescript
- Замораживание объектов литеральных типов объектов