Перейти к основному содержимому

Typescript

Стек технологий

Мы используем следующие инструменты для разработки:

  • Node.js: версия 20.x.
  • pnpm: для управления зависимостями.
  • Vite: в качестве сборщика.

Общие правила

1. Кодовая база

  • Пишем код только на TypeScript.
  • Используем pnpm для установки и управления зависимостями.
  • Используем строгий линтинг и форматирование, описанные в этом документе.

2. Форматирование

  • Отступы — 4 пробела.
  • Строки заключаем в двойные кавычки ("string").
  • Используем точку с запятой (;) в конце каждой инструкции.
  • Максимальная длина строки — 120 символов.

3. Стиль именования

  • Используем camelCase для переменных и функций.
  • Используем PascalCase для названий классов и типов.
  • Переменные и параметры должны быть понятными и информативными. Минимальная длина идентификатора — 2 символа, за исключением переменных i и j (например, в циклах).
  • Не допускается использование _ в начале или конце имен.

4. Линтинг

  • Используем ESLint с конфигурацией для TypeScript.
  • Настраиваем правила, чтобы обеспечить строгую проверку и консистентность.

Настройки ESLint для TypeScript

{
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"rules": {
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/explicit-function-return-type": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{ "args": "all", "argsIgnorePattern": "^_" }
],
"@typescript-eslint/no-inferrable-types": "error",
"quotes": ["error", "double"],
"semi": ["error", "always"],
"indent": ["error", 4],
"max-len": ["error", { "code": 120 }],
"camelcase": ["error", { "properties": "always" }],
"id-length": [
"error",
{ "min": 2, "properties": "always", "exceptions": ["i", "j"] }
],
"no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
"no-lone-blocks": "error",
"no-tabs": "error",
"no-trailing-spaces": "error",
"no-unreachable": "error",
"no-bitwise": "error",
"prefer-const": "error",
"eqeqeq": ["error", "always"],
"no-shadow": "error",
"no-param-reassign": "error",
"complexity": ["error", { "max": 10 }],
"max-params": ["error", 3],
"prefer-object-spread": "error",
"no-warning-comments": [
"error",
{ "terms": ["FIXME"], "location": "anywhere" }
]
}
}

Примеры кода: Good / Bad

Отступы

Good:

function greet(name: string): string {
return `Hello, ${name}`;
}

Bad:

function greet(name: string): string {
return `Hello, ${name}`;
}

Кавычки

Good:

const greeting = "Hello, world!";

Bad:

const greeting = 'Hello, world!';

Точка с запятой

Good:

const name = "Alice";
console.log(name);

Bad:

const name = "Alice"
console.log(name)

Именование переменных

Good:

const userName = "John";
const userAge = 25;

Bad:

const user_name = "John";
const UserAge = 25;

Использование any

Good:

function calculate(input: number): number {
return input * 2;
}

Bad:

function calculate(input: any): any {
return input * 2;
}

Неиспользуемые переменные

Good:

function processItems(items: string[]): void {
items.forEach(item => {
console.log(item);
});
}

Bad:

function processItems(items: string[]): void {
items.forEach(item => {
const unusedVar = item;
});
}

Использование let вместо const

Good:

const count = 10;

Bad:

let count = 10;

Сложность функций

Good:

function isEligible(age: number, hasID: boolean): boolean {
return age >= 18 && hasID;
}

Bad:

function isEligible(age: number, hasID: boolean, isCitizen: boolean): boolean {
if (age >= 18) {
if (hasID) {
if (isCitizen) {
return true;
}
}
}
return false;
}