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
提供,则 A
是 B
的子类型。 A
的传统不是决定因素。
在你的例子中 SExpr
只有一个成员,一个 toString
方法不带参数和 returns 一个 string
,以及所有 JavaScript 对象提供这样一个成员,包括strings
.
总而言之,TypeScript 的行为符合预期,您应该考虑一种不同的方法,例如使用 Discriminated Unions,而不是 class 层次结构来表示程序中各种表达式的类型解析。
我正在使用 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
提供,则 A
是 B
的子类型。 A
的传统不是决定因素。
在你的例子中 SExpr
只有一个成员,一个 toString
方法不带参数和 returns 一个 string
,以及所有 JavaScript 对象提供这样一个成员,包括strings
.
总而言之,TypeScript 的行为符合预期,您应该考虑一种不同的方法,例如使用 Discriminated Unions,而不是 class 层次结构来表示程序中各种表达式的类型解析。