Typescript + Next.js 不是类型检查功能 parameters/arguments

Typescript + Next.js not type checking function parameters/arguments

我正在使用 typescript 和 next.js 开发一个项目,由于某些原因,函数参数的类型没有被检查。

我在下面提供了一个代码示例,我希望函数调用会抱怨我提供了 string 而不是 SExpr

abstract class SExpr {
  abstract toString(): string
}

function parse(expr: SExpr) {
  // ...
}

parse('123') // does not complain - compiles just fine

我以前从来没有遇到过这样的问题,并且已经尽力在tsconfig.json中找到更改的选项来解决这个问题,但遗憾的是一直无法修复。

此时我怀疑 next.js 可能会覆盖我的 tsconfig.json 或类似的东西,因为我在使用 typescript 时从未遇到过任何问题。

我的tsconfig.json如下:

{
  "compilerOptions": {
    "target": "es6",
    "lib": ["dom", "dom.iterable", "esnext"],
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "baseUrl": ".",
    "noImplicitAny": true,
    "allowJs": true,
    "skipLibCheck": true,
    "alwaysStrict": true,
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}

这是设计使然。

TypeScript 有一个结构类型系统,而不是名义上的类型系统。在结构类型系统中,如果 B 的所有成员都由 A 提供,则 AB 的子类型。 A 的传统不是决定因素。

在你的例子中 SExpr 只有一个成员,一个 toString 方法不带参数和 returns 一个 string,以及所有 JavaScript 对象提供这样一个成员,包括strings.

总而言之,TypeScript 的行为符合预期,您应该考虑一种不同的方法,例如使用 Discriminated Unions,而不是 class 层次结构来表示程序中各种表达式的类型解析。