我有两个界面,X
和Y
。 X
具有2个属性,x1
和x2
。现在Y
希望从X
继承,但不想继承x2
。
interface X {
x1 : string;
x2 : string;
}
interface Y extends X{
// x2 shouldn't be available here
}
作为TypeScript
中的新功能,我无法弄清楚。 extends X without x1
中是否有任何TypeScript
类型的内置功能?
注意:在我的真实情况下,X
是内置的interface
。因此,我需要执行此操作而不更改X
接口。有可能吗?
答案 0 :(得分:9)
这可以使用Typescript 2.1和2.8中引入的Pick
和Exclude
类型来实现:
/**
* From T pick a set of properties K
*/
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
/**
* Exclude from T those types that are assignable to U
*/
type Exclude<T, U> = T extends U ? never : T;
使用这些类型定义,您可以构造Omit<T,K>
以省略泛型的特定属性:
/**
* From T pick all properties except the set of properties K
*/
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
要说明Typescript 2.8 Release Notes为什么打字稿中不包含此类型:
我们没有包含Omit类型,因为它写得很简单 为
Pick<T, Exclude<keyof T, K>>
。
尽管Typescript中未包含它,但一些库提供了它们自己的相似 Omit
类型,包括react-redux或Material-UI。
Here是一个有效的示例:
interface X {
x1: string;
x2: string;
}
type Y = Omit<X, 'x2'>;
let x: X = {
x1: 'string1',
x2: 'string2'
}
let y: Y = {
x1: 'string1'
}
请注意,将检查要排除的属性,排除指定类型中未定义的属性是错误的:
答案 1 :(得分:-2)
interface X {
x1 : string;
x2 : string;
}
class Y implements X{
x1: string;
get x2():string {
return "sorry but x2 is not available here";
}
}