为什么在实现接口时需要显式键入我的方法参数?

时间:2018-05-16 04:38:00

标签: typescript

例如:

if(isset($_POST['submit']))

interface Foo { someProperty: Number someMethod?: (str: string) => void } class Bar implements Foo { someProperty = 42 someMethod (str) { console.log(this.someProperty) } } 的{​​{1}}参数显然是一个字符串。但是编译器抱怨道:

str

我做错了什么?

修改:someMethod()报告版本2.8.3。

3 个答案:

答案 0 :(得分:3)

  

我做错了什么?

无。 TypeScript as mentioned here不支持它。

修复

在班级中提供明确的注释。

答案 1 :(得分:2)

  

someMethod()的str参数显然是一个字符串

不一定。你可以编写一些满足界面的不同签名;例如

    someMethod (s: string | number) {

    someMethod (s: any) {

implements子句只是对您的类进行的 post hoc 检查,以确保您的类成功实现了该接口。它 not 直接更改类中任何声明的属性或方法的类型。

如果您没有拥有any子句,那么您有隐式implements,那么您有一个隐含的any < em> with ,因为implements条款不会影响班级成员的类型。

答案 2 :(得分:1)

类不是实现接口的唯一方法。如果使用创建并返回对象(有时称为工厂函数)而不是类的函数,则不必显式键入方法参数:

interface Foo {
  someProperty: number
  someMethod?: (str: string) => void
}

function createBar(): Foo {
    return {
        someProperty: 42,
        someMethod: (str) => {
            const n = str.length; // ok because parameter inferred as  str: string
        }
    }
}