Typescript + Next.js没有类型检查函数参数/参数



我正在做一个与typescript &由于某些原因,函数参数的类型没有被检查。

我在下面提供了一个代码示例,我希望函数调用抱怨我提供了一个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方法,它不接受参数并返回string,所有JavaScript对象都提供这样的成员,包括strings

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

最新更新