如何强制类仅具有接口参数

时间:2019-12-28 18:14:53

标签: typescript

强制类A仅具有接口参数仅名称

interface I {
name: string;
}

Class A implements I{
name: string;
age: string; <=  it should generate error 
}

1 个答案:

答案 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属性中,因此您在需要的地方出现错误。

好的,希望能有所帮助;祝你好运!

Playground Link to code