TypeScript 1.4的联合参数

时间:2015-01-18 10:14:58

标签: typescript1.4

我在使用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,这实际上不是一个选项,因为我失去了类型检查的全部优势。

1 个答案:

答案 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);
    // ...
}