代码之家  ›  专栏  ›  技术社区  ›  Radex

如何在typescript中键入承诺的回调?

  •  2
  • Radex  · 技术社区  · 8 年前

    我可以键入的回调。然后在我的承诺,目前我暂时使用 any string 或类似的。

    知道怎么输入我的md5函数吗?

    export const md5 = (path: string) =>
      new Promise((resolve, reject) => {
        const hash = createHash("sha1");
        const rs = createReadStream(path);
        rs.on("error", reject);
        rs.on("data", chunk => hash.update(chunk));
        rs.on("end", () => resolve(hash.digest("hex")));
      });
    
    
      it("should hash md5 a file", () => {
        // error here on hash:string, if I use instead any it works
        const m = md5(fileName).then((hash: string) => {
          assert.strictEqual(m, "4738e449ab0ae7c25505aab6e88750da");
        });
    

    收到错误:

    Argument of type '(hash: string) => void' is not assignable to parameter of type '(value: {}) => void | PromiseLike<void>'.
      Types of parameters 'hash' and 'value' are incompatible.
        Type '{}' is not assignable to type 'string'.
      });
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   GibboK    8 年前

    考虑直接指定返回承诺类型 new Promise<string> :

    export const md5 = (path: string) =>
      new Promise<string>((resolve, reject) => {
        const hash = createHash("sha1");
        const rs = createReadStream(path);
        rs.on("error", reject);
        rs.on("data", chunk => hash.update(chunk));
        rs.on("end", () => resolve(hash.digest("hex")));
      });
    

    请同时检查测试中是否有错误,请更换 m 具有 hash :

    assert.strictEqual(hash, "4738e449ab0ae7c25505aab6e88750da");
    
        2
  •  1
  •   joh04667    8 年前

    要么给Promise一个泛型类型参数,要么给 md5

    export const md5 = (path: string): Promise<string> =>
      new Promise<string>((resolve, reject) => {
        const hash = createHash("sha1");
        const rs = createReadStream(path);
        rs.on("error", reject);
        rs.on("data", chunk => hash.update(chunk));
        rs.on("end", () => resolve(hash.digest("hex")));
      });
    
        3
  •  1
  •   Deval    8 年前

    你所缺少的只是“返回”。更改为:

    export const md5 = (path: string) =>
        return new Promise((resolve, reject) => {
            const hash = createHash("sha1");
            const rs = createReadStream(path);
            rs.on("error", reject);
            rs.on("data", chunk => hash.update(chunk));
            rs.on("end", () => resolve(hash.digest("hex")));
        });