首页 > 解决方案 > 对象冻结文字对象类型

问题描述

给定一些冻结的对象:

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

它的类型是Readonly<{a:number, b:number}>,有没有办法定义它,以便它的类型是Readonly<{a:1, b:2}>,而不诉诸强制转换?

我想要这个的原因是,我想使用值类型来缩小另一个函数的输入,例如:function foo(input: 1 | 2)

标签: typescript

解决方案


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 });

推荐阅读