是否有方法更改*.d中定义的接口属性的类型?Ts在typescript中?
例如:
x.d.ts中的接口定义为
interface A {
property: number;
}
我想在我写入的typescript文件中改变它
interface A {
property: Object;
}
甚至这个也可以
interface B extends A {
property: Object;
}
这种方法有效吗?当我试我的系统时,它不工作。只是想确认一下有没有可能?
如果其他人需要一个通用的实用程序类型来做到这一点,我提出了以下解决方案:
/**
* Returns object T, but with T[K] overridden to type U.
* @example
* type MyObject = { a: number, b: string }
* OverrideProperty<MyObject, "a", string> // returns { a: string, b: string }
*/
export type OverrideProperty<T, K extends keyof T, U> = Omit<T, K> & { [P in keyof Pick<T, K>]: U };
我需要这个,因为在我的例子中,覆盖的关键是一个泛型本身。
如果没有准备好省略,请参阅从类型中排除属性。
不能更改现有属性的类型。
你可以添加一个属性:
interface A {
newProperty: any;
}
而是改变现有的一种类型:
interface A {
property: any;
}
导致一个错误:
后续变量声明必须具有相同的类型。变量
'property'必须是'number'类型,但这里有'any'类型
当然,您可以拥有自己的接口来扩展现有的接口。在这种情况下,你可以重写一个类型到一个兼容的类型,例如:
interface A {
x: string | number;
}
interface B extends A {
x: number;
}
顺便说一下,你可能应该避免使用Object作为类型,而是使用any类型。
在任何类型的文档中,它声明:
any类型是使用现有JavaScript的强大方式,
允许您在过程中逐渐选择加入或退出类型检查
编译。您可能希望Object扮演类似的角色
在其他语言中是这样。但是Object类型的变量只允许你
要给它们赋值-你不能调用任意的方法
他们,甚至那些真实存在的人:
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
基于ZSkycat的出色回答,您可以创建一个抽象的Override泛型类型,该类型易于使用并清楚地解释了代码的意图。
type Override<T, K extends keyof T, N> =省略<T, K> & {[K中的K1]: N};
地点:
现有类型
K =您希望覆盖的类型的键
N =要覆盖现有类型的键的新类型
使用示例:
type GraphQLCodegenConfig =覆盖<CodegenConfig, 'schema', DocumentNode>;