Typescript如何将第三方库接口的可选属性重写为必填属性
问题根因
你当前的写法触发了TypeScript的接口继承规则限制:
- 扩充接口时如果直接继承原始的
BaseUiOption,会保留原始接口中id字段的可选修饰符,子接口中同名字段的必填标记无法覆盖父接口的可选属性定义,最终合并后的id仍为可选类型。 - 你提前用别名
BaseUiOption保存了扩充前的原始类型,别名不会跟随模块扩充更新,即使接口定义修改成功,用该别名声明的变量还是会沿用原始类型规则。
正确实现方案
使用TypeScript内置的Omit工具类先剔除原始接口中要修改的id字段,再重写自定义的必填属性即可:
import { Option as BaseUiOption } from "baseui/select"; declare module "baseui/select" { // 先排除原始id字段,再新增自定义定义 export interface Option extends Omit<BaseUiOption, 'id'> { readonly id: string | number; readonly idx: string | number; } } // 直接使用扩充后的Option类型,不要用提前保存的BaseUiOption别名 import { Option } from "baseui/select"; const x: Option = { id: "a", idx: "a" }; x.id.toString(); // 无报错 x.idx.toString();
补充说明
如果需要修改多个属性的可选性,可以给Omit传入联合类型的第二个参数,比如Omit<BaseUiOption, 'id' | 'name'>就可以同时剔除id和name两个字段,再逐个重写即可。
内容的提问来源于stack exchange,提问作者simPod
相关产品推荐
相关产品推荐

