我正在尝试实现一个基类,该基类将字符串类型的并集作为通用类型,然后在抽象方法中使用带有这些字符串的字典作为键。
当将其他属性传递给抽象方法的子方法时,它的子实现不会引发类型错误(但如果未将属性传递给它,则不会正确地引发错误):
abstract class Parent<T extends string = string> {
abstract doSomethingWithT(options: { [key in T]: string }): void;
}
class Child extends Parent<"foo" | "morefoo"> {
/**
* Would like to error on 'bar'
*/
doSomethingWithT(arg: { foo: string; morefoo: string; bar: string }) {
}
}
有没有在Typescript中实现此功能的好方法?
问题是options: { [k in T]: string }
确实匹配,{ foo: string; morefoo: string; bar: string }
因为它匹配{ foo: string; morefoo: string; }
并且其余类型被忽略。要实施更严格的匹配,您可以执行以下操作:
abstract class Parent<T extends string = string> {
abstract doSomethingWithT(options: { [k in T]: string } & Record<string, never>): void;
}
class Child extends Parent<"foo" | "morefoo"> {
doSomethingWithT(arg: { foo: string; morefoo: string; bar: string }) {
}
}
never
如果将Record<string, never>
用作参数,这里可以确保它会出错。如果给它一个仅{ [k in T]: string }
与之匹配的参数,则该参数应该起作用。
不知道这可能还会带来什么其他副作用:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句