强制类A仅具有接口参数仅名称
interface I {
name: string;
}
Class A implements I{
name: string;
age: string; <= it should generate error
}
答案 0 :(得分:1)
我不确定为什么需要这样做,但是只要您愿意在定义中两次提及类名,就可以使用recursively bounded type来获得所需的行为。
type Exactly<T, U extends T> = { [K in keyof U]: K extends keyof T ? T[K] : never }
class A implements Exactly<I, A> {
name: string = "needs initialization";
age: string = "me too" // error!
// ~~~ <--- string is not assignable to never
}
类型Exactly<T, U>
是具有mapped属性的conditional类型。 Exactly<T, U>
的输出具有与U
相同的键,但是T
中no的任何键的值均为never
类型。
约束U extends T
意味着U
必须至少具有{em> T
的所有属性。并且class U implements Exactly<T, U>
中的约束意味着U
不得具有在T
中找不到的任何定义的属性,否则U
不能与Exactly<T, U>
匹配。
在上面的代码示例中,A
类似于{name: string, age: number}
。并且Exactly<I, A>
的值为{name: string, age: never}
。因此未满足约束class A implements Exactly<I, A>
,因为{name: string, age: number}
未实现{name: string, age: never}
。问题出在age
属性中,因此您在需要的地方出现错误。
好的,希望能有所帮助;祝你好运!