如何为继承类SpecialObject定义TypeScript类型,兼容父类并确保属性存在
解决JavaScript Schema转TypeScript类型的方案
1. 确保Object1的类型可访问
如果依赖的some/library自带TypeScript类型定义,直接导入类型:
import type { Object1 } from 'some/library'; // CommonJS环境下可这样写 const { Object1 } = require('some/library') as typeof import('some/library');
如果库没有类型,手动声明Object1的基础类型:
declare class Object1 { // 补充Object1实际存在的属性、方法 exampleMethod(): void; exampleProp: string; }
2. 定义SpecialObject的实例类型
创建接口同时继承Object1的实例类型和自定义的property1类型:
interface SpecialObjectInstance extends Object1 { property1: number; }
3. 让类实例类型与自定义类型关联
方式一:实例化时断言类型
创建实例时直接断言为SpecialObjectInstance,无需修改类定义:
const specialObj = new SpecialObject() as SpecialObjectInstance; specialObj.property1; // 类型识别为number specialObj.exampleMethod(); // 正常访问Object1的方法
方式二:合并类与接口声明
通过接口合并,让TypeScript自动识别类实例的扩展类型:
class SpecialObject extends Object1 {} // 合并接口,扩展类的实例类型 interface SpecialObject extends SpecialObjectInstance {} // 实例化后直接识别所有类型 const specialObj = new SpecialObject(); specialObj.property1 = 456; // 类型检查通过
4. 给静态schema属性添加类型
如果需要约束静态的schema属性,添加类型声明:
// 先定义schema的结构类型 type SchemaField = { type: typeof Types.Number; default: number }; type SpecialSchema = { property1: SchemaField }; // 给类的静态属性添加类型 declare class SpecialObject { static schema: SpecialSchema; } // 赋值时自动做类型检查 SpecialObject.schema = { property1: { type: Types.Number, default: 0 } };
内容的提问来源于stack exchange,提问作者KarljoY973
相关产品推荐
相关产品推荐

