首页 > 解决方案 > 修复没有不必要的泛型

问题描述

所以我只是尝试在 GitHub 上提出一个拉取请求,在那里我将泛型添加到方法调用中。该方法将其传递给一个接口,然后该接口确定其方法的返回类型。

现在 linter 开始抱怨:

ERROR: 65:105  no-unnecessary-generics  Type parameter ResultT is used only once.

这是哪一行:

executeSql<ResultT = any>(sqlStatement: string, arguments?: any[]): Promise<[Transaction, ResultSet<ResultT>]>;

这是界面:

export interface ResultSetRowList<ResultT> {
    length: number;
    raw(): ResultT[];
    item(index: number): ResultT;
}

所以我不认为这是一个no-unnecessary-generics问题,或者是吗?

有拉取请求

标签: typescriptgenericstslint

解决方案


“没有不必要的泛型”发生在泛型参数仅使用一次时,例如

const foo = <T>(x: T) => ....
// as it is literally same as
const foo = (x: any) => ....

当泛型至少使用两次时

const foo = <T>(x: T): T => ....

它会起作用的。

我觉得这条规则是不必要的。将其关闭可能更明智,因为它看不到接口的“内部”来检查使用情况。因此,它可以将使用一次作为接口的通用参数视为误报。

该规则的主要思想是防止这种情况发生

const foo = <T extends SomeType>(x: T) => ...

因为它实际上和写作一样

const foo = (x: SomeType) => .... // and this is good practice

在这两种情况下,您都在分配继承/实现 SomeType 或 SomeType 的变量。在第一种情况下,您实际上选择了必须实现类型的泛型参数,然后使用泛型参数作为函数参数的类型,而在第二种情况下,您将类型直接用于函数的参数。

该问题的最佳解决方案是禁用该规则

编辑:如果您仍然想在保持代码的同时保留规则,请将代码放在/* tslint:disable:no-unnecessary-generics *//* tslint:enable:no-unnecessary-generics */注释之间,因为它们会禁用它们之间的 linting 以针对指定的规则。更多关于 tslint 的规则标志:https ://palantir.github.io/tslint/usage/rule-flags/


推荐阅读