【发布时间】:2021-06-15 23:56:20
【问题描述】:
我正在将一个 JS 项目转换为 TS,在这里我遇到了这个错误(使用 urql):
A function whose declared type is neither 'void' nor 'any' must return a value. ts(2355)上线:
playerCreate: (result, args, cache): UpdateResolver => {
为什么?
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,而类型是函数而不是返回类型。
因此问题:
如何在此处正确输入playerCreate 和playerDelete?
【问题讨论】:
-
在
playerCreate方法中弄清楚你想要返回什么(在JS逻辑中),然后返回它,然后改变UpdateResolver类型来匹配它。目前还不清楚你想要那里的 JS 逻辑。 -
TS 不知道
result, args, cache, info。我想告诉它:“那个函数类型是UpdateResolver!”。只是我不知道怎么... -
@FredHors 这是一个分配了箭头函数的属性,而不是真正的方法。
{ foo: "hello" }和{ bar: () => {} }在语法上是等效的:具有属性的对象,您可以在其中为属性分配值。副本显示了如何给这样的东西一个类型 - 要么键入 the object 要么做一个类型断言。后者与您已经得到的答案相同。 -
@FredHors @VLAZ 关于键入对象的说法是写
const updates: {Mutation: Record<string, UpdateResolver>} = {...并从各个函数中删除类型。您还可以在对象之外编写函数并将其拼凑在一起。const playerCreate: UpdateResolver = (....然后const updates = { Mutation: { playerCreate, playerDelete }, }, };问题是如果不使用as断言,您不能同时设置属性并声明该属性的类型(这可能很危险,因为它是覆盖,而不是检查) .
标签: typescript