TypeScript:如何输入保护联合类型
TypeScript: how to type guard union type
函数compose
可以将一个对象或一个对象数组作为其参数。
在compose
中,类型保护区分了对象和数组。这
函数 mapper
只能处理对象,通过使用类型保护,它只能处理对象。
interface Link {
something: string;
}
function compose(link: Link|Link[]) {
if (link instanceof Array) {
R.map(function(l) {
return mapper(l);
}, link);
} else {
return mapper(link);
}
}
function mapper(link: Link) {
return link;
}
编译此示例导致错误:
错误 TS2345:'Link | Link[]' 类型的参数不可分配给 'Link'
类型的参数
这个错误是可以理解的,因为映射器获取一个联合类型作为其参数,但只需要一个对象。这不是我在使用类型保护时所希望的。对此有什么想法吗?
似乎 TypeScript 1.4.0.0 不推断 link
必须是 Link
类型,而不是 Array
类型。一个小改动应该可以解决这个问题:
function compose(link: Link|Link[]) {
if (link instanceof Array) {
R.map(function(l) {
return mapper(l);
}, link);
} else if (link instanceof Link) {
return mapper(link);
}
}
或者,您可以断言类型:
return mapper(<Link> link);
函数compose
可以将一个对象或一个对象数组作为其参数。
在compose
中,类型保护区分了对象和数组。这
函数 mapper
只能处理对象,通过使用类型保护,它只能处理对象。
interface Link {
something: string;
}
function compose(link: Link|Link[]) {
if (link instanceof Array) {
R.map(function(l) {
return mapper(l);
}, link);
} else {
return mapper(link);
}
}
function mapper(link: Link) {
return link;
}
编译此示例导致错误:
错误 TS2345:'Link | Link[]' 类型的参数不可分配给 'Link'
类型的参数这个错误是可以理解的,因为映射器获取一个联合类型作为其参数,但只需要一个对象。这不是我在使用类型保护时所希望的。对此有什么想法吗?
似乎 TypeScript 1.4.0.0 不推断 link
必须是 Link
类型,而不是 Array
类型。一个小改动应该可以解决这个问题:
function compose(link: Link|Link[]) {
if (link instanceof Array) {
R.map(function(l) {
return mapper(l);
}, link);
} else if (link instanceof Link) {
return mapper(link);
}
}
或者,您可以断言类型:
return mapper(<Link> link);