Skip to content

规则检查 (Rule-Based Evaluation)

格式验证、内容规则、代码质量检查

2.1 格式验证

javascript
class FormatValidator {
  // 检查 JSON 格式
  validateJSON(output) {
    try {
      JSON.parse(output);
      return { valid: true };
    } catch (e) {
      return { valid: false, error: e.message };
    }
  }

  // 检查代码语法
  async validateTypeScript(code) {
    const ts = require('typescript');

    const result = ts.transpileModule(code, {
      compilerOptions: {
        module: ts.ModuleKind.ESNext,
        target: ts.ScriptTarget.ESNext,
        strict: true
      },
      reportDiagnostics: true
    });

    if (result.diagnostics.length > 0) {
      return {
        valid: false,
        errors: result.diagnostics.map(d => d.messageText)
      };
    }

    return { valid: true };
  }

  // 检查 Markdown 结构
  validateMarkdown(content, requiredSections) {
    const headings = content.match(/^#+\s+.+$/gm) || [];
    const missing = requiredSections.filter(
      section => !headings.some(h => h.toLowerCase().includes(section.toLowerCase()))
    );

    return {
      valid: missing.length === 0,
      missing
    };
  }
}

2.2 内容规则

javascript
class ContentValidator {
  constructor(rules) {
    this.rules = rules;
  }

  validate(output) {
    const results = [];

    for (const rule of this.rules) {
      switch (rule.type) {
        case 'contains':
          results.push({
            rule: rule.name,
            passed: output.includes(rule.value),
            message: `应包含 "${rule.value}"`
          });
          break;

        case 'not_contains':
          results.push({
            rule: rule.name,
            passed: !output.includes(rule.value),
            message: `不应包含 "${rule.value}"`
          });
          break;

        case 'matches':
          results.push({
            rule: rule.name,
            passed: new RegExp(rule.pattern).test(output),
            message: `应匹配模式 ${rule.pattern}`
          });
          break;

        case 'length':
          const len = output.length;
          results.push({
            rule: rule.name,
            passed: len >= rule.min && len <= rule.max,
            message: `长度应在 ${rule.min}-${rule.max} 之间,实际 ${len}`
          });
          break;
      }
    }

    return {
      allPassed: results.every(r => r.passed),
      results
    };
  }
}

// 使用示例
const validator = new ContentValidator([
  { type: 'contains', name: 'has_export', value: 'export' },
  { type: 'not_contains', name: 'no_any', value: ': any' },
  { type: 'not_contains', name: 'no_console', value: 'console.log' },
  { type: 'matches', name: 'has_types', pattern: 'interface|type' }
]);

2.3 代码质量检查

javascript
async function validateCodeQuality(code) {
  const checks = [];

  // ESLint 检查
  const eslint = new ESLint();
  const lintResults = await eslint.lintText(code, { filePath: 'test.tsx' });
  checks.push({
    name: 'eslint',
    passed: lintResults[0].errorCount === 0,
    errors: lintResults[0].messages
  });

  // TypeScript 类型检查
  const tsResult = await validateTypeScript(code);
  checks.push({
    name: 'typescript',
    passed: tsResult.valid,
    errors: tsResult.errors
  });

  // 安全检查
  const securityIssues = checkSecurityIssues(code);
  checks.push({
    name: 'security',
    passed: securityIssues.length === 0,
    issues: securityIssues
  });

  return checks;
}

function checkSecurityIssues(code) {
  const issues = [];
  const patterns = [
    { pattern: /dangerouslySetInnerHTML/g, message: '使用了 dangerouslySetInnerHTML' },
    { pattern: /eval\(/g, message: '使用了 eval' },
    { pattern: /innerHTML\s*=/g, message: '直接设置 innerHTML' },
    { pattern: /document\.write/g, message: '使用了 document.write' }
  ];

  for (const { pattern, message } of patterns) {
    if (pattern.test(code)) {
      issues.push(message);
    }
  }

  return issues;
}

前端面试知识库