是否有方法更改*.d中定义的接口属性的类型?Ts在typescript中?
例如:
x.d.ts中的接口定义为
interface A {
property: number;
}
我想在我写入的typescript文件中改变它
interface A {
property: Object;
}
甚至这个也可以
interface B extends A {
property: Object;
}
这种方法有效吗?当我试我的系统时,它不工作。只是想确认一下有没有可能?
注意:不确定我在这个答案中使用的语法是否可用,当写旧的答案时,但我认为这是解决这个问题中提到的例子的更好方法。
我有一些与这个主题相关的问题(覆盖接口属性),这是我如何处理它:
首先创建一个泛型接口,其中包含您想要使用的可能类型。
您甚至可以为通用参数使用选择默认值,如<T extends number | SOME_OBJECT = number>中所示
type SOME_OBJECT = { foo: "bar" }
interface INTERFACE_A <T extends number | SOME_OBJECT = number> {
property: T;
}
然后你可以根据该契约创建新类型,通过将一个值传递给泛型参数(或省略它并使用默认值):
type A_NUMBER = INTERFACE_A; // USES THE default = number TYPE. SAME AS INTERFACE_A<number>
type A_SOME_OBJECT = INTERFACE_A<SOME_OBJECT> // MAKES { property: SOME_OBJECT }
这就是结果:
const aNumber: A_NUMBER = {
property: 111 // THIS EXPECTS A NUMBER
}
const anObject: A_SOME_OBJECT = {
property: { // THIS EXPECTS SOME_OBJECT
foo: "bar"
}
}
打印稿操场
不能更改现有属性的类型。
你可以添加一个属性:
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'.