说我有
interface A {
apple?: number;
[key: string]: any;
}
interface B extends A {
banana?: number;
}
Run Code Online (Sandbox Code Playgroud)
我想要一个type C扩展 all fromA和 all from Bexcept [key: string]: any;。我想要一个type D继承所有 fromB除了 all from A。
我如何制作C和D打字稿?
从 中选取全部B,删除A索引签名:
type C = Pick<B, KnownKeys<B>>;
Run Code Online (Sandbox Code Playgroud)
从 中选取所有内容B,从 中排除所有内容A,删除A索引签名:
type D = Omit<C, KnownKeys<A>>
Run Code Online (Sandbox Code Playgroud)
Type仅使用已知的属性键KnownKeys<T>删除 的索引签名T(归功于 Mihail Malostanidis 及其在这里和这里的回答):
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
Run Code Online (Sandbox Code Playgroud)
C类型和D外观如何?
type C = {
banana?: number | undefined;
apple?: number | undefined;
}
type D = {
banana?: number | undefined;
}
const c: C = {
apple: 1,
banana: 2,
}
const d: D = {
banana: 2
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |