0

我在使用联合参数时遇到了一些麻烦。想象一下我有这样一个功能:

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,这不是一个真正的选择,因为我失去了类型检查的全部优势。

4

1 回答 1

1

如果你想绕过 TypeScript 的类型系统,你总是可以使用<any>cast。

但是,在这种情况下,有一个更好的解决方案:

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);
    // ...
}
于 2015-01-18T10:17:26.660 回答