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
实际的表现:没有得到任何错误提示
这个实现并不算“错误”,因为是兼容的(注意是单向的),你按规定的接口调用这个方法是不会有直接的错误的:对于参数
x
,传给Test.prototype.fn1
时会被忽略,对函数调用没有直接影响;对于返回值类型,接口Foo
规定了这个函数没有返回值,一般情况下等效于这个函数的返回值应该被忽略,所以实际上你返回了一个值也不会有影响,毕竟被忽略了,返回什么都不要紧。我不知道ts有没有哪个选项能严格禁止这种情况的,但一般会不有影响,你如果试图把一个
Foo
类型对象的fn1
方法的返回值当成string
来用,到时候就会报错了。