Typescript readonly 属性 分配错误但仍在编译

Typescript readonly property assignment error but still compiling

我正在使用 typescript atm,运行 遇到了只读参数的问题。我设置了一个带有只读参数的接口,但仍然可以在编译之前在初始化和导入的对象上修改它们。编译器抱怨它但仍然编译代码。

这是我的例子:

Configuration.ts

import { readFileSync } from 'fs'
import * as YAML from 'yaml'

/**
 * @interface Configuration
 * Defines the server configuration
 */
interface Configuration {
    readonly port: number
}

let config: Configuration
let initialized: boolean = false

if (!initialized) {
    const file = readFileSync(__dirname + '/../../config.yml', 'utf8')
    config = YAML.parse(file)
    initialized = true
}

export default config;

现在我将它导入我的 index.ts:

import app from './App'
import config from './internals/Configuration' //config.port is now 8889

// This is not allowed.
config.port = 8080

app.listen(config.port, (err) => {
  if (err) {
    return console.log(err)
  }

  return console.log(`server is listening on ${config.port}`)
})

IDE 告诉我 config.port = 8080 是不允许的,编译器也这样说:

[08:49:02] File change detected. Starting incremental compilation...

src/index.ts:4:8 - error TS2540: Cannot assign to 'port' because it is a read-only property.

4 config.port = 8080
         ~~~~

[08:49:02] Found 1 error. Watching for file changes.

但是服务器仍然在端口 8080 上启动。所以尽管编译器抛出 error 它仍然编译代码。我希望 error 编译失败,因为这就是我想使用打字稿的原因,不是吗?

我是不是遗漏了什么,做错了什么?

默认情况下,即使出现类型错误,编译器仍会输出JavaScript。您可以通过将 noEmitOnError 编译器选项设置为 true:

来关闭此功能

tsconfig.json:

{
  "compilerOptions": {
    "noEmitOnError": true
  }
}