我正在做一个与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
提供,则A
是B
的子类型。A
的遗传不是决定因素。
在你的例子中,SExpr
只有一个成员,一个toString
方法,它不接受参数并返回string
,所有JavaScript对象都提供这样的成员,包括strings
。
总之,TypeScript的行为符合预期,你应该考虑一种不同的方法,比如使用discriminationunion,而不是使用类层次结构来表示程序解析的各种表达式的类型。