检查变量是否是打字稿联合中的特定接口类型

mya*_*sev 10 typescript typescript1.4

是否可以创建一个typeguard或其他完成相同目的的东西来检查变量是否是打字稿联合中的特定接口类型?

interface Foo { a:string }
interface Bar { b:string }

(function() {
    function doStuff(thing: Foo | Bar) {
        if(typeof thing === 'Foo') {
            console.log('Foo');
        } 
        else if (typeof thing === 'Bar') {
            console.log('Bar');
        }
        else {
            console.log('unknown');
        }
    }

    var thing: Foo = {a:'a'};
    doStuff(thing);
})();
Run Code Online (Sandbox Code Playgroud)

Fl4*_*l4v 7

从Typescript 1.6开始,您可以使用用户定义的类型保护:

let isFoo = (object: Foo| Bar): object is Foo => {
    return "a" in object;
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards

  • 这里最重要的答案是 TypeScript 将对象中的“key”理解为区分接口的一种方式。遗憾的是,“typeof object.key === 'undefined'”在这种情况下失败了。 (2认同)
  • 这种方法的一个问题是,如果“a”重命名为“aa”,即使“a”不再是“Foo”接口的鉴别器,代码仍然可以编译。实际上,最好不要使用类型保护,而只使用“in”进行内联成员检查。然后编译器将推断类型 - 只要“a”是“Foo”的一部分。有人有更类型安全的方法吗? (2认同)

Rya*_*ugh 6

typeof不这样做.它总是返回"string","number","boolean","object","function"或"undefined".

您可以使用if(thing.a !== undefined) {或等测试来测试对象属性if(thing.hasOwnProperty('a')) {.

请注意,您可以创建一个包含字符串a又包含字符串的对象b,因此请注意这种可能性.

  • 因此,如果不检查特定属性(例如我们示例中的“a”),就无法检查变量是否符合接口? (2认同)