使用泛型+联合类型从类中实现抽象方法时,类型安全性问题[Typescript]

马特本斯图

我正在尝试实现一个基类,该基类将字符串类型的并集作为通用类型,然后在抽象方法中使用带有这些字符串的字典作为键。

当将其他属性传递给抽象方法的子方法时,它的子实现不会引发类型错误(但如果属性传递给它,则不会正确地引发错误):

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用泛型实现类型安全?

来自分类Dev

使用泛型时失去类型安全性

来自分类Dev

使用泛型时失去类型安全性

来自分类Dev

泛型类使用泛型参数

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

泛型-使用父类在泛型中指定类型

来自分类Dev

Typescript:泛型,使用泛型扩展类型

来自分类Dev

覆盖方法的问题(使用泛型类型)

来自分类Dev

泛型-动态使用类型

来自分类Dev

Java的泛型类型使用

来自分类Dev

使用类型安全性定义打字稿泛型

来自分类Dev

使用泛型向地图添加泛型类型的对象

来自分类Dev

如何使用泛型实现类型声明?

来自分类Dev

如何使用泛型缩小TypeScript联合类型

来自分类Dev

使用泛型时覆盖抽象方法

来自分类Dev

嵌套在泛型中的类的泛型使用

来自分类Dev

在泛型类中使用匿名类型

来自分类Dev

如何使用类型的辅助类泛型

来自分类Dev

使用类对象作为泛型类型

来自分类Dev

使用类实例作为泛型类型

来自分类Dev

使用泛型替换特定的类类型

来自分类Dev

使用类泛型构造的子类型

来自分类Dev

使用泛型类似方法

来自分类Dev

重构方法使用泛型

来自分类Dev

使用 TypeScript checkJs 在 JSDoc 中扩展泛型类型的方法?

来自分类Dev

使用非泛型类注册泛型接口

来自分类Dev

使用嵌套泛型类型调用方法

来自分类Dev

Typescript泛型是否使用类型擦除来实现泛型?

来自分类Dev

Java中的泛型类型使用