jed*_*mao 5 overriding interface typescript type-definition typescript2.0
我知道如何扩展 TypeScript 接口,但我在这里问的是如何覆盖接口中的特定键。例如,假设我有一个简单的界面A:
interface A {
foo: string;
bar: number;
}
Run Code Online (Sandbox Code Playgroud)
我有另一个简单的界面B,也有一个bar键,但类型不同:
interface B {
bar: string;
baz: number;
}
Run Code Online (Sandbox Code Playgroud)
本质上,我想将这些接口合并为一个,给出以下接口:
interface C {
foo: string; // from A.foo
bar: string; // from B.bar (overrides A.bar)
baz: number; // from B.baz
}
Run Code Online (Sandbox Code Playgroud)
我希望我能以某种方式扩展:
interface C extends A, B {}
Run Code Online (Sandbox Code Playgroud)
但我不能,因为我收到了这个错误,这完全是预期的并且是设计使然的:
接口“C”不能同时扩展类型“A”和“B”。类型“A”和“B”的命名属性“bar”不相同。
我只是不确定是否还有另一种我不知道的机制。我认为交集或联合类型在这里也没有帮助。
有点晚了......但我解决了这个问题,创建了另一种类型......
type ExcludeAddress<T> = Omit<T, 'addresses'>;
Run Code Online (Sandbox Code Playgroud)
这种类型从界面中排除特定的键(我称为“地址”)...
我用它来解决一个需要转换接口值的问题...
我删除了它,然后创建了一个扩展旧接口(没有密钥)的新接口+一个具有新 keyType 的接口...
例子:
type ExcludeAddress<T> = Omit<T, 'addresses'>;
export interface IAvailability {
readonly frequency: number;
readonly duration: number;
readonly date: string;
readonly addresses: Address[];
}
export interface ISerializedAvailability extends ExcludeAddress<IAvailability> {
readonly addresses: string[];
}
Run Code Online (Sandbox Code Playgroud)
您需要调整我为您自己的个人项目创建的ExcludeAddress ...
也许这不是 cleaneast 解决方案,但是...它有效
在我的示例中:我创建的ISerializedAvailability本质上是一个IAvailability,其中地址的类型为string[]而不是Address[]