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

时间:2018-11-23 14:10:58

标签: typescript

TypeScript 3.0 起,新的顶级类型 unknown 就可以用作 any 的类型安全的副本。

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

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

class Test {

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

    return false;
  }

} 

我的问题

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

1 个答案:

答案 0 :(得分:0)

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

Typescript: instanceof check on interface

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

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=interface%20MySuperInterface%20%7B%0D%0A%20%20%20%20superfunction()%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Aclass%20MySuperImplementation%20implements%20MySuperInterface%20%7B%0D%0A%20%20%20%20superfunction()%3A%20string%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20%22Hello%20from%20super%20function%22%3B%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Aclass%20Greeter%20%7B%0D%0A%20%20%20%20greeting%3A%20string%3B%0D%0A%0D%0A%20%20%20%20constructor(message%3A%20string)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.greeting%20%3D%20message%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20greet()%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20%22Hello%2C%20%22%20%2B%20this.greeting%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20testSuperFunction(value%3A%20unknown)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(value%20instanceof%20MySuperImplementation)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20value.superfunction()%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22Error%22%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0Alet%20greeter%20%3D%20new%20Greeter(%22world%22)%3B%0D%0A%0D%0Aconst%20sfunc%20%3D%20new%20MySuperImplementation()%3B%0D%0A%0D%0Aconsole.log(greeter.testSuperFunction(sfunc))%3B