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

TS2322:类型不可分配给带有箭头函数的类型

彭宏阔
2023-03-14

我正在尝试定义一个基本接口,其中包含一个箭头函数作为属性。但是,它给了我一个TS错误。

interface InterfaceTest {
  input?: (test: number | string) => number | undefined;
}

const myVariable: InterfaceTest = {
  input: (test: number) => {
    return test;
  },
};

const myVariable2: InterfaceTest = {
  input: (test: string) => {
    return parseInt(test, 2);
  },
};

TS2322:类型'(测试:数字)=

事实上,我不理解这个错误,因为我想要一个字符串或一个数字作为我的函数的参数,它告诉我我不能只使用数字。如何将字符串或数字作为箭头函数的输入?

此外,当我这样做,错误消失

interface InterfaceTest {
  input?(test: number | string): number | undefined;
}

const myVariable: InterfaceTest = {
  input: (test: number) => {
    return test;
  },
};

const myVariable2: InterfaceTest = {
  input: (test: string) => {
    return parseInt(test, 2);
  },
};

为什么?

共有1个答案

司徒河
2023-03-14

简言之。。如果接口说可以传递字符串或数字,那么在实现该接口时。。该函数还需要能够接收字符串或数字。

如果接口的实现将类型从string | number减少为juststring或justnumber,则会破坏契约。

所以我现在做的是不可能的

这有点难说,因为你的例子是一个非常人工的例子,可能不能代表你实际要做的事情。

使用接口的想法是,其他东西可以接收该接口的实例,并且可以放心地使用字符串或数字来访问您的函数。显然,您的情况并非如此,因为myVariable只接受一个数字,myVariable2只接受一个字符串。

可以这样表示接口:

interface InterfaceTest {
   input?: (test: number) => number | undefined | (test: string) => number | undefined;
}

此接口说明,如果存在input,则它必须具有这两个函数中的任何一个的实现,但使用此函数也会遇到问题,因为现在很难确定接口的实现是number还是string类型。

这可能意味着类型保护或类型断言。

但回到原点,我认为这个例子有点荒谬。界面的目标是什么?为什么它是一个界面呢?

在什么情况下,您需要能够将myVariable替换为myVariable2

剥离接口显然是有效的,因此您使用接口一定有原因:

const myVariable = {
  input: (test: number) => {
    return test;
  },
};

const myVariable2 = {
  input: (test: string) => {
    return parseInt(test, 2);
  },
};

有一种方法可以解决这种低谷泛型,但我不太愿意建议这样做,因为我担心你可能没有出于正确的原因使用这个接口。

但它在这里:

假设您的InterfaceTest有许多函数,并且可能有一个输入函数。但是基本上有两种变体,一种变体只适用于数字,另一种变体只适用于字符串。

示例的通用版本如下所示:

interface InterfaceTest<T> {
  input?(test: T): number | undefined;
}

const myVariable: InterfaceTest<number> = {
  input: (test: number) => {
    return test;
  },
};

const myVariable2: InterfaceTest<string> = {
  input: (test: string) => {
    return parseInt(test, 2);
  },
};
 类似资料:
  • 我有两个TypeScript包,其中一个包(包A)依赖于另一个包(包B)。每个包都使用Karma设置了一个单元测试。在安装了NPM中的所有依赖项之后,当我分别为每个依赖项运行单元测试时,单元测试运行良好。然而,如果我在包A中使用npm link package-b并运行包A的单元测试,那么我会得到标题中所述的错误:“TS2322:类型‘Timeout’不可分配给类型‘number’。” 该行是对s

  • 将以下代码转换为typescript时出错。 错误TS2339:属性样式在元素类型上不存在。 当我为如下相同的值分配所需值时 那么误差在元素上,那就是 错误TS2322:类型“Element | null”不可分配给类型“{style:any;}”。类型“null”不可分配给类型“{style:any;}”。

  • 我有这个打字代码: 给我以下错误: 严重性代码描述项目文件行抑制状态错误构建:“字符串|1”类型的参数不能分配给“字符串”类型的参数。 有人能帮我吗?我刚刚升级到新版本的Typescript,这条消息现在出现在多个地方。当我将鼠标悬停在categoryColumnWide上时,它显示这是一个“数字” 据我所知,我使用的是Typescript 2.1

  • 这是我的水果 现在我正在导入另一个typescript文件中的fruit.ts。这是我的 当我做的时候 我得到一个错误: 类型“string”不能分配给类型“orange”“apple”“banana”“ 如何将字符串赋给自定义类型fruit的变量?

  • 我有一个问题,归结为试图将具有特定参数类型的函数分配给期望具有泛型类型的函数的变量: 游乐场版。 TypeScript给出以下错误: 类型“(v:string[]))= 这个错误对我来说没有多大意义,因为对于泛型,似乎是一个非常合理的类型。 有一个相关的问题具有相同的基本问题,但是答案是特定于该问题的情况的:为什么实现接口的TypeScript类不能分配给扩展接口的通用约束?