是否有可能创建一个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);
})();
在TypeScript 2中,您可以使用如下区别联合:
interface Foo {
kind: "foo";
a:string;
}
interface Bar {
kind: "bar";
b:string;
}
type FooBar = Foo | Bar;
let thing: FooBar;
然后使用if(thing.kind==="foo")
测试对象。
如果您只有两个字段,如示例中所示,我可能会使用@ryan cavanaugh提到的组合接口,并使这两个属性都是可选的:
interface FooBar {
a?: string;
b?: string
}
请注意,在原始示例中,使用if(thing.a!==undefined)
测试对象会产生错误类型“Foo | Bar”上不存在属性“a”
使用
if(thing.hasOwnProperty('a'))
测试它不会在if
语句中将类型缩小为Foo
。
@ryan cavanaugh在TypesScript 2.0或2.1中有更好的方法吗?
typeof
不这样做。它总是返回“字符串”、“数字”、“布尔”、“对象”、“函数”或“未定义”。
您可以使用类似的测试来测试对象属性if(事情. a!==未定义){
或if(thing.hasOwnProperty('')) {
。
请注意,您可以创建一个同时具有字符串
a
和字符串b
的对象,因此请注意这种可能性。
自TypeScript 1.6以来,您可以使用用户定义的类型防护:
let isFoo = (object: Foo| Bar): object is Foo => {
return "a" in object;
}
看https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guardshttps://github.com/microsoft/TypeScript/issues/10485
我在TypeScript中使用一个接口来定义一个函数,该函数仅在扩展基类的一些类上可用。这是我到目前为止的代码的简化版本: 现在,问题是我会添加更多的“行走”动物,这样移动动物的功能就会变得太大而无法控制。我想做的事情是这样的: 但是,“implements”检查不起作用,在使用接口时,我找不到与“instanceof”等效的。在Java中,“instanceof”的使用似乎可以在这里使用,但Ty
问题内容: 我想知道如何检查变量是否是类(不是实例!)。 我试图使用该函数来执行此操作,但我不知道类将具有哪种类型。 例如,在以下代码中 我试图用 ??? 代替“ ” ,但我意识到这是python中的关键字。 问题答案: 更好的是:使用该功能。
问题 你希望检查一个变量是否为一个数组。 myArray = [] console.log typeof myArray // outputs 'object' “typeof” 运算符为数组输出了一个错误的结果。 解决方案 使用下面的代码: typeIsArray = Array.isArray || ( value ) -> return {}.toString.call( value ) i
我正在尝试实现这样一个方法,它接受一个关键参数,该参数要么是要么是可索引类型接口的实例。实现如下所示: Typescript给出块的以下错误: [ts]“IValidationContextIndex”仅引用类型,但在此处用作值。 有什么办法解决这个问题吗? 对于大多数接口,我认为可以添加属性(;),但这在本例中不起作用,因为该接口是可索引类型的接口....
问题内容: 假设我有任何变量,定义如下: 我想要一个检查变量类型是否像函数一样的函数。即: 如何检查变量是否为上述定义的类型? 问题答案: 当然,下划线的方式效率更高,但是当效率不是问题时,最好的检查方法是写在@Paul Rosania链接的下划线页面上。 受下划线启发,最终的isFunction函数如下:
问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?