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

如何在没有instanceof的情况下以有意义的方式使用“unknown”?

龙越彬
2023-03-14

由于TypeScript 3.0,新的top type unknown可作为任何类型的类型安全对应项使用。

我真的很喜欢这种类型,因为它使代码更加健壮。

我的主要问题是,TypeScript(显然)在运行时没有为接口提供instanceof-特性。如果可能的话,此代码将非常有效:

class Test {

  doSomething(value: unknown) {
    if(value instanceof MySuperInterface) {
      return value.superFunction();
    }

    return false;
  }

} 

我的问题

如何以有意义的方式使用此类型,而无需检查接口的每个属性?

共有1个答案

梁锋
2023-03-14

在运行时,JavaSept不检查接口类型。

Typescript:instanceof check on接口

但是,您可以对类使用未知类型,如下所示:

interface MySuperInterface {
    superfunction(): string;
}

class MySuperImplementation implements MySuperInterface {
    superfunction(): string {
        return "Hello from super function";
    }
}

class Greeter {
    greeting: string;

    constructor(message: string) {
        this.greeting = message;
    }

    greet() {
        return "Hello, " + this.greeting;
    }

    testSuperFunction(value: unknown) {
        if (value instanceof MySuperImplementation) {
            return value.superfunction();
        }
        else {
            return "Error";
        }
    }
}

let greeter = new Greeter("world");

const sfunc = new MySuperImplementation();

console.log(greeter.testSuperFunction(sfunc));

https://www.typescriptlang.org/play/index.html#src=interfaceMySuperInterface{ 超级函数():字符串; } 类MySuperImplementation实现MySuperInterface{ 超级函数():字符串{ 返回“Hello from super function”; } } 迎宾员{ 问候语:字符串; 构造函数(消息:string){ 这问候=留言; } 问候{ 返回“你好,”+这个。招呼 } testSuperFunction(值:未知){ if(MySuperImplementation的值实例){ 返回值。超函数(); } 否则{ 返回“错误”; } } } 让迎宾员=新迎宾员(“世界”); const sfunc=new MySuperImplementation(); 安慰日志(greeter.testSuperFunction(sfunc));

 类似资料:
  • 我有一个问题要解决,我应该在哪里从使用Java8 streams的员工列表中找到性别为男性的第n个员工,如果没有找到,则返回可选的空。 下面是接受Employee对象列表和整数n的方法,其中n表示必须返回的第n个男性雇员(如果存在的话)。

  • 我正在玩grpc 有人成功使用进行生产吗?我们需要包括特使在内的所有依赖项吗?

  • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

  • 我有一个带有私有方法的类,该方法调用一些外部类并执行它,如果不使用powermock,我如何防止这种情况发生?(该项目使用Junit5,目前还不支持powermock)。 我考虑过将这些函数移到外面,但我觉得有时方法确实属于特定的类,因为它们是它的一部分,将它们移出对我来说没有意义,下面只是一个例子来说明。 我已经知道大多数人会说不要测试私有方法,但a.我不完全同意,b.我不想在这里测试这个方法,

  • 问题内容: 我看到了一些这样的代码: 我以为应该有一个? 为什么这段代码这样做呢? 问题答案: 如果您希望当前执行的方法仍引发异常,同时允许适当地清理资源,则这很有用。下面是处理调用方法中的异常的具体示例。

  • 问题内容: 我在整个应用程序中都使用spring 。现在,我也想为一个没有的创建一个。那有可能吗? 问题答案: JPA要求每个实体都有一个ID。因此,不可以,没有ID的实体是不允许的。 每个JPA实体都必须有一个主键。 从JPA规范 您可能想从这里阅读更多有关JPA如何处理数据库端没有ID的情况的信息(请参阅“无主键”)。