我在使用union参数时遇到了一些麻烦。想象一下,我有这样一个功能:
interface IColumnDefinition {
id: string;
title: string;
}
addColumn(definition: string|IColumnDefinition) {
if (typeof (definition) === "string") {
definition = { id: definition, title: definition };
}
var column = new JSColumn(definition);
...
}
我希望用户传递一个定义新列的完整对象,或者只传递string
,在这种情况下我会创建一个默认对象。
但是,TypeScript有两个问题:
definition = { id: definition };
是不允许的,因为TypeScript认为definition
可能不是字符串 - 这是错误的,因为我在上面创建了一行typeof
。new JSColumn(definition)
是不可能的,因为构造函数需要一个IColumnDefinition
对象,definition
也可能是一个字符串 - 这也是错误的,因为上面的if
确保它始终是一个正确的对象。我该怎么做才能说服TypeScript这些不是错误?有什么像演员表,其中说“嘿,这个变量属于xyz
类型。相信我,我知道我做了什么。”
我目前正在将参数定义为any
,这实际上不是一个选项,因为我失去了类型检查的全部优势。
答案 0 :(得分:2)
如果要绕过TypeScript的类型系统,可以始终使用<any>
强制转换。
在这种情况下,有一个更好的解决方案:
function addColumn(definition: string | IColumnDefinition) {
var colDef: IColumnDefinition;
if (typeof definition === "string") {
colDef = { id: definition, title: definition };
} else {
colDef = definition;
}
var column = new JSColumn(colDef);
// ...
}
另一个选项,可能不太清楚,但生成一个较小的JS代码:
function addColumn(definition: string | IColumnDefinition) {
var column = new JSColumn(
(typeof definition === "string")
? { id: definition, title: definition }
: definition);
// ...
}