跳至主要内容

typedef

在某些地方要求类型注解。

TypeScript 无法始终推断代码中所有位置的类型。某些位置需要类型注解才能推断其类型。

此规则可以强制在位置上进行类型注解,无论它们是否需要。这通常用于维护有时需要它们的元素类型的 consistency。

class ContainsText {
// There must be a type annotation here to infer the type
delayedText: string;

// `typedef` requires a type annotation here to maintain consistency
immediateTextExplicit: string = 'text';

// This is still a string type because of its initial value
immediateTextImplicit = 'text';
}

要强制在调用签名上存在类型定义,请使用 explicit-function-return-typeexplicit-module-boundary-types

注意

不必要地要求类型注解可能难以维护,并且通常会降低代码可读性。TypeScript 通常比易于编写的类型注解更擅长推断类型。

建议使用 --noImplicitAny--strictPropertyInitialization 编译器选项来强制仅在有用时进行类型注解,而不是启用 typedef

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/typedef": "error"
}
};

在 playground 中尝试此规则 ↗

选项

此规则接受以下选项

type Options = [
{
arrayDestructuring?: boolean;
arrowParameter?: boolean;
memberVariableDeclaration?: boolean;
objectDestructuring?: boolean;
parameter?: boolean;
propertyDeclaration?: boolean;
variableDeclaration?: boolean;
variableDeclarationIgnoreFunction?: boolean;
},
];

const defaultOptions: Options = [
{
arrayDestructuring: false,
arrowParameter: false,
memberVariableDeclaration: false,
objectDestructuring: false,
parameter: false,
propertyDeclaration: false,
variableDeclaration: false,
variableDeclarationIgnoreFunction: false,
},
];

例如,使用以下配置

{
"rules": {
"@typescript-eslint/typedef": [
"error",
{
"arrowParameter": true,
"variableDeclaration": true
}
]
}
}
  • 箭头函数参数上的类型注解是必需的
  • 变量上的类型注解是必需的

arrayDestructuring

是否强制对使用数组解构声明的变量进行类型注解。

带有 { "arrayDestructuring": true } 的代码示例

const [a] = [1];
const [b, c] = [1, 2];
在 Playground 中打开

arrowParameter

是否强制对箭头函数的参数进行类型注解。

带有 { "arrowParameter": true } 的代码示例

const logsSize = size => console.log(size);

['hello', 'world'].map(text => text.length);

const mapper = {
map: text => text + '...',
};
在 Playground 中打开

memberVariableDeclaration

是否强制对类的成员变量进行类型注解。

带有 { "memberVariableDeclaration": true } 的代码示例

class ContainsText {
delayedText;
immediateTextImplicit = 'text';
}
在 Playground 中打开

objectDestructuring

是否强制对使用对象解构声明的变量进行类型标注。

带有 { "objectDestructuring": true } 的代码示例

const { length } = 'text';
const [b, c] = Math.random() ? [1, 2] : [3, 4];
在 Playground 中打开

parameter

是否强制对函数和方法的参数进行类型标注。

带有 { "parameter": true } 的代码示例

function logsSize(size): void {
console.log(size);
}

const doublesSize = function (size): number {
return size * 2;
};

const divider = {
curriesSize(size): number {
return size;
},
dividesSize: function (size): number {
return size / 2;
},
};

class Logger {
log(text): boolean {
console.log('>', text);
return true;
}
}
在 Playground 中打开

propertyDeclaration

是否强制对接口和类型的属性进行类型标注。

带有 { "propertyDeclaration": true } 的代码示例

type Members = {
member;
otherMember;
};
在 Playground 中打开

variableDeclaration

是否强制对变量声明进行类型标注,不包括数组和对象解构。

带有 { "variableDeclaration": true } 的代码示例

const text = 'text';
let initialText = 'text';
let delayedText;
在 Playground 中打开

variableDeclarationIgnoreFunction

忽略非箭头函数和箭头函数的变量声明。

带有 { "variableDeclaration": true, "variableDeclarationIgnoreFunction": true } 的代码示例

const text = 'text';
在 Playground 中打开

何时不使用它

如果您使用更严格的 TypeScript 编译器选项,特别是 --noImplicitAny 和/或 --strictPropertyInitialization,您可能不需要此规则。

一般来说,如果您认为编写不必要的类型标注的成本不合理,那么请不要使用此规则。

进一步阅读

资源