如何忽略已分配类型,从字面量生成TypeScript类型?
如何在TypeScript中保留对象字面量的实际类型同时进行类型校验
我需要从一个符合指定类型的对象字面量生成其实际包含属性的窄类型,但直接给变量指定类型后,typeof只能拿到指定的宽类型,无法获取字面量的真实类型。
需求场景
type BigOptionalObject = { prop1?: string prop2?: string prop3?: string }; // 希望编写对象时能得到BigOptionalObject的类型校验,确保符合要求 const MyObject: BigOptionalObject = { prop1: 'hi' }; // 期望TypeOfMyObject是{ prop1: string }或{ prop1: 'hi' },但实际是BigOptionalObject type TypeOfMyObject = typeof MyObject;
尝试过的无效方法
- 加
as const仍无法覆盖指定的类型:
const MyObject: BigOptionalObject = { prop1: 'hi' } as const; // typeof结果仍是BigOptionalObject type TypeOfMyObject = typeof MyObject;
- 用类型断言也无法得到预期的字面量类型:
const MyObject = { prop1: 'hi' } as BigOptionalObject; // typeof结果不符合预期 type TypeOfMyObject = typeof MyObject;
解决方案
可以通过泛型函数实现:既约束对象符合目标类型,又保留字面量的实际类型。
type BigOptionalObject = { prop1?: string prop2?: string prop3?: string }; // 泛型函数,约束T继承自BigOptionalObject,同时返回T本身 const createTypedObject = <T extends BigOptionalObject>(obj: T) => obj; // 编写时会得到BigOptionalObject的类型校验,同时变量类型是字面量的实际类型 const MyObject = createTypedObject({ prop1: 'hi' }); // TypeOfMyObject为{ prop1: string } type TypeOfMyObject = typeof MyObject; // 如果需要字面量的精确类型(比如'hi'而不是string),可以加as const const MyObjectLiteral = createTypedObject({ prop1: 'hi' } as const); // TypeOfMyObjectLiteral为{ readonly prop1: 'hi' } type TypeOfMyObjectLiteral = typeof MyObjectLiteral;
这个方法的核心是利用泛型的类型推导,让函数返回传入字面量的真实类型,同时通过T extends BigOptionalObject确保字面量符合目标类型的约束,满足编写时的类型校验需求。
内容的提问来源于stack exchange,提问作者knappsacks
相关产品推荐
相关产品推荐

