typescript中class以错误的函数签名去implements interface里的method却得不到错误提示

interface Foo {
  fn1(x: string): void;
}

class Test implements Foo {
  public fn1 (): string {
    return "111"
  }
}

tsconfig如下

{
  "compilerOptions": {
    "rootDir": ".",
    "target": "es5",
    "module": "esnext",
    "outDir": "./out-tsc",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": true,
    "sourceMap": true,
    "baseUrl": ".",
    "allowJs": true,
    "checkJs": false,
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx"
  ]
}

期望的表现: 提示Test错误地实现了Foo

实际的表现:没有得到任何错误提示

回复
阅读 1.3k
1 个回答

这个实现并不算“错误”,因为是兼容的(注意是单向的),你按规定的接口调用这个方法是不会有直接的错误的:对于参数x,传给Test.prototype.fn1时会被忽略,对函数调用没有直接影响;对于返回值类型,接口Foo规定了这个函数没有返回值,一般情况下等效于这个函数的返回值应该被忽略,所以实际上你返回了一个值也不会有影响,毕竟被忽略了,返回什么都不要紧。

我不知道ts有没有哪个选项能严格禁止这种情况的,但一般会不有影响,你如果试图把一个Foo类型对象的fn1方法的返回值当成string来用,到时候就会报错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏