我正在寻找一种方法Confine<A, B>
到另一个接口,因为它A
和B
都必须具有相同的属性。
export type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
interface Cat {
cat: string | null,
created_at: Date,
};
没关系:
type StrictCat = Confine<Cat, Merge<Cat, {
cat: string,
}>>
这不行:
type StrictCat = Confine<Cat, Merge<Cat, {
name: string,
}>>
答案 0 :(得分:1)
当A extends B
和B extends A
时,A与B具有相同的键,因此:
type Check<A, B> = A extends B ?
B extends A ? true : false
: false;
type Result = Check<{}, {}> // true
type Result1 = Check<{ key: string }, {}> // false
type Result2 = Check<{}, { key: string }> // false
type Result3 = Check<{ key: string }, { key: string }> // true
或者代替false,您可以分配never
类型以确保不会被使用
答案 1 :(得分:0)
您可以将其转换为Minimum, Complete and Verifiable Example吗?我猜测Merge
并没有真正的意义(您可以将Merge<X, Y>
替换为其结果)。并且const varname = TypeFunction<>
无效的TypeScript。解决此问题后,您能否明确说明“应该没问题”的意思?也就是说,您期望StrictCat
的确切类型是什么?
所有这些,可能您想要的是
type Confine<A, B extends { [K in keyof B]: K extends keyof A ? A[K] : never }> = B;
但是我不想花太多时间来充实这个答案,如果它不能解决您的问题。谢谢!