如何在TypeScript中正确地为类方法分配类型?

mxg2im7a  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(213)

在这个职位的建设过程中,我解决了我的问题,但我仍然认为,可能有不同的方法,我想知道它。
...
我有一个类,需要两个输入相同的方法,这两个方法都没有返回值,只是它们的主体稍有不同。
因为我可能会对这些方法做一些修改,所以我希望把它们输入到一个地方(与分别输入它们相反),这样看起来也会更干净。
下面我创建了简化的示例代码来模拟我的问题。
...
我已经检查了documentation的类型函数,但我没有发现这些问题会在方法上重现。
方法“meow1”和“meow5”是有效的。但是我仍然期望,一定有不同的方法(不使用赋值操作符)。

如何重写没有赋值运算符的“meow4”?
如果类型正确描述了函数,是否可以保留空括号?(“meow3”和“meow6”)

type MeowMethodType = (meowText:string) => void;

这是我在文档中找到的:

const meow:MeowMethodType = (meowText:string) => {
    console.log(meowText)
}

这就是我所尝试的:

class Cat {
    // Works, but does not solve my issue..
    meow1 (meowText:string):void {
        console.log(meowText);
    }

    // Error: A function whose declared type is neither 'void' nor 'any' must return a value.
    meow2 (meowText:string):MeowMethodType {
        console.log(meowText)
    }

    // Is such thing possible?
    meow3:MeowMethodType () {
        console.log(meowText)
    }

    // Produces many errors, so I am not sure, how to correct it.
    meow4:MeowMethodType (meowText:string) {
        console.log(meowText)
    }

    // This one works!
    meow5:MeowMethodType = (meowText:string) => {
        console.log(meowText)
    }

    // This one does not..
    meow6:MeowMethodType = () => {
        console.log(meowText)
    }
}

谢谢你的任何提示或线索。

vvppvyoh

vvppvyoh1#

看起来您想减少样板文件。这只有在定义对象时才有可能,并且需要将样板文件移动到其他位置:

type MeowMethodType = (meowText:string) => void;

interface Meow {
  meow1: MeowMethodType
  meow2: MeowMethodType
}

type Implement<Interface> = Interface & { [k: string]: unknown }

const Cat = {
  meow1(x) {
    //  ^? string
  },

  meow2(x) {
    //  ^? string
  },

  run(distance: number) {

  }
} satisfies Implement<Meow> ;

satisfiesImplement一起使用使得TS检测到诸如run的其他方法,并且同时将自变量x的类型推断为string
如果你需要一个类,实现一个接口只会强制你根据接口输入方法,这是可以的:它可以防止接口更改时出现错误,但不能删除样板文件。

class Cat implements Meow {
  meow1(x: string) {
    //     ^^^^^^ you are forced to add this
  }

  meow2(x: string) {
    //     ^^^^^^ you are forced to add this
  }

  run(distance: number) {

  }
}

meow5中,您还忽略了可以删除参数上的类型注解

meow5:MeowMethodType = (meowText) => {
  //                       ^? string
}

运动场

相关问题