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

如何允许返回类型

景靖琪
2023-03-14

考虑以下代码

type deviceStatusType = string | boolean | number | undefined;

class A {
 protected constructor() {
        this.status = {
        "a": 1,
        "b": "b"
        }
    }

    getDeviceStatus<T extends deviceStatusType>(arg: deviceStatusType,  code: string): T {
        const status = this.status[code];

        let actualType = typeof status;
        if (actualType !== arg){
            throw new Error(`mode should be a ${arg} but is: ${typeof(status)}`)
        }

        return status;
    }
}

我得到了错误

TS2322: Type 'string | number | boolean' is not assignable to type 'T'.   'string | number | boolean' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'deviceStatusType'.     Type 'string' is not assignable to type 'T'.       'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'deviceStatusType'.

on返回状态-但我真的希望能够将类型检查移动到此函数中,因为这减少了我必须将类型检查到一个位置的次数。

共有1个答案

董砚
2023-03-14

由于您已经完成了显式类型检查,您可以将状态声明为任何可以分配给T的返回值的代码。如果你愿意,你可以稍微改进一下

class A {
  getDeviceStatus<T extends deviceStatusType>(arg: T, code: string): T {
    const status = this.status[code];
    if (isType(status, arg)) {
        return status;
    }
    throw new Error(`mode should be a ${arg} but is: ${typeof(status)}`);
  }
}

function isType<T extends deviceStatusType>(actual: any, arg: T): actual is T {
  return typeof actual === arg;
}
 类似资料:
  • 问题内容: 我想做这样的事情: 不幸的是,列表追加未返回修改后的列表。 那么,我如何允许返回新列表? 问题答案: 不要使用追加而是串联: 这将返回一个 新 列表。不会受到影响。如果你需要有受影响的 还有 既可以使用,无论如何,然后分配分开(复印件)。

  • 问题内容: 这是我的代码,但是我没有得到方法如何接受类型作为返回值。如何运作?谁能解释一下这种方法的工作原理? 提前致谢 :) 问题答案: 好的,所以首先要做的是: 这是一个不断扩大的原始类型转换,因此这是合法的。您可以: 但是您不能: 第二:它返回的根本不是ASCII码。Java执行Unicode。 碰巧的是,当创建Java时,Unicode仅定义了适合16位的代码点。因此,它被创建为2字节的无

  • 问题内容: 我正在编写一个Android 2.2应用程序,该应用程序将JSON严格性过帐到ReSTfull Web服务。 Fiddler对Web服务的调用具有与预期相同的Json返回,而对ASPX Web应用程序具有与预期的相同Json返回。 当我查看服务器日志时,可以看到服务器使用307重定向响应初始POST动词,然后立即响应GET和405错误。 Fiddler和aspx应用程序记录一个307重

  • 在C++98中,以下代码无法编译,因为ifstream没有复制构造函数: 但是,在C++11中使用多个GCC版本时,编译时不会出现警告。这是什么原因?

  • 问题内容: 我已经看完了这个演讲。 幻灯片编号:26引用 这些说法正确吗? 如果两个语句都正确,那么如何使代码可编译,以便jvm运行代码? 提前致谢。 问题答案: 这些说法是完全正确的。 请记住,Java是两件事- 一是语言,其二是虚拟机。尽管将语言限制为不允许基于类型的方法重载使Java成为一种更简单的语言,但JVM仍可以允许这样做以使其更强大。 作为一种语言,Java具有一种编译器,该编译器执

  • 我已经用TestNG创建了一个Selenium框架。在此框架中,@Dataprovider包含一组代码,这些代码从Excel读取数据,并将该值作为2D数组返回给@Test。 “get”方法返回字符串[]。但我得到的错误是“数据提供程序必须返回对象[]”。如果我将其更改为对象[],则我的测试用例失败,错误如下: