当前位置: 首页 > 知识库问答 >
问题:

如何在这里使用Typescript在对象中正确键入函数?

莫飞翮
2023-03-14

我将JS项目转换为TS,这里我有这个错误(使用urql):

声明类型既不是“void”也不是“any”的函数必须返回值。ts(2355)在线:

结果,参数,缓存

为什么?

const updates = {
  Mutation: {
    playerCreate: (result, args, cache): UpdateResolver => {
      const playersQueries = cache
        .inspectFields("Query")
        .filter((x) => x.fieldName === "players");
      playersQueries.forEach(({ fieldName, arguments: variables }) =>
        cache.invalidate("Query", fieldName, variables)
      );
    },

    playerDelete: (result, args, cache, info): UpdateResolver => {
      // using result, args, cache here
    },
  },
};

我可以看到Updateresolver是这样声明的:

export declare type UpdateResolver = (result: Data, args: Variables, cache: Cache, info: ResolveInfo) => void;

更新:

有人正确地告诉我,我是说这个函数返回一个UpdateResolver,而类型是函数的,而不是返回类型。

因此问题是:

我怎样才能正确地在这里键入player创建playerDelete

共有1个答案

耿学义
2023-03-14

尝试将代码更改为:

const updates = {
  Mutation: {
    playerCreate: (result: Data, args: Variables, cache: Cache): void => {
      const playersQueries = cache
        .inspectFields("Query")
        .filter((x) => x.fieldName === "players");
      playersQueries.forEach(({ fieldName, arguments: variables }) =>
        cache.invalidate("Query", fieldName, variables)
      );
    },

    playerDelete: (result: Data, args: Variables, cache: Cache, info: ResolveInfo): void => {
      // using result, args, cache here
    },
  },
};

编辑:我发现使用作为运算符实际上是可能的:

const updates = {
  Mutation: {
    playerCreate: (((result, args, cache) => {
      const playersQueries = cache
        .inspectFields("Query")
        .filter((x) => x.fieldName === "players");
      playersQueries.forEach(({ fieldName, arguments: variables }) =>
        cache.invalidate("Query", fieldName, variables)
      );
    }) as UpdateResolver),

    playerDelete: (((result, args, cache, info) => {
      // using result, args, cache here
    }) as UpdateResolver),
  },
};

什么是TypeScript中的作为运算符?

它告诉TypeScript编译器认为运算符之前的表达式在运算符之后具有类型。你可以用它做一些奇怪的事情:

const test = "some string" as number;
// "test" is number here!!

所以在使用它的地方要小心!当您将其应用于函数时,TypeScript将看到例如参数one应该具有类型T,因此它假装函数也采用类型T参数

作为,还有一种替代方法,但不能在TSX文件中使用:

const something = <number>"hello";
// don't do that if you don't know the actual type!

当然这个例子是错误的,因为TypeScript会认为字符串是一个数字,但它不是。但是它显示了类型断言的用法。

 类似资料:
  • 在TypeScript中,< code>class关键字引入了值和类型: 有没有一种方法可以使函数返回既是类型又是值的东西? 问这个问题的另一种方法是:有没有办法在下面声明的类型,以便类型检查? 看到这个打字游戏了吗

  • React/Typescript中对象的类型是什么,例如: 如果我需要将它定义为一个对象,我应该输入什么类型,而不是

  • 我有两个不同类型的对象,我想用一个对象指定另一个。 的接口有一个,而到

  • TS演示:https://tsplay.dev/mLO04N , 问题:当我将reduce中返回对象的children注释去掉,返回的类型就变成any了,请问正确姿势应该是? 我把提取的值像这样复制给一个对象,获取的类型是对的,但是如果把这个对象作为返回数据类型就不对了 请不要试图类似用下面断言的方式来解决,我试图通过正确的姿势获取数据类型:

  • 注意:我知道有很多关于这个主题的帖子,我已经审阅了相当多的没有成功(请看我在这篇文章底部的参考资料)。 我正试图使用Visual Studio代码在TypeScript中运行一个非常简单的测试,其中我在一个文件中声明一个类并将其导入到另一个文件中。但是,我仍然遇到一个问题,我正在导入的文件无法识别我从另一个文件导出的类的方法。 此时我收到的确切错误消息是: [ts]属性“Get FirstName

  • 我在打字方面有点吃力。假设有一个literal对象,它的值是用spread运算符赋值的: 更新类型库后,将引发以下TS错误: 尝试在此答案中设置literal对象上的接口,但未解决此问题,因为一定是语法有问题: 将属性保存为的正确方法是什么?

  • 问题内容: 例如,我正在尝试导出TS对象以获取以下JavaScript输出: 这是我的TS,但导出尚不明确, 我已经尝试过了,但是它的生成的输出是不期望的。我究竟做错了什么? 问题答案: 在ES6中,允许使用导出功能导出名称,或者默认情况下,您可以导出任何内容。该格式是这样的: 并且它将默认导出配置文件。对于您的情况,您应该执行以下操作: 如果要使用导出,请执行以下操作: 区别是: 至 注意-默认

  • 我正在尝试将一个带有符号的对象定义为键类型,因为 MDN 说: 符号值可用作对象属性的标识符[…] 但是使用它作为键属性的类型: 导致以下错误: TS1023:索引签名参数类型必须为“字符串”或“数字”。 甚至它也可以用作索引类型。我正在使用最新的打字稿版本(),我发现了相关问题: 类型脚本:以符号为键解构对象(他使用的是符号的实际实例,我想要类型) TypeScript:当尝试使用字符串|数字时