定义文件:属性的多种可能类型

时间:2013-07-12 12:48:40

标签: typescript

我正在为现有的JS库(CKEditor)编写一些定义。是否可能比toolbar: any更具体?

文档:

  

toolbar:Array / String

     

工具箱(别名工具栏)定义。它是工具栏名称或   工具栏(条带)数组,每个工具栏也是一个数组,包含一个   UI项目列表。

图书馆代码:

var toolbar = editor.config.toolbar;

// If it is a string, return the relative "toolbar_name" config.
if ( typeof toolbar == 'string' )
    toolbar = editor.config[ 'toolbar_' + toolbar ];

return ( editor.toolbar = toolbar ? populateToolbarConfig( toolbar ) : buildToolbarConfig() );

3 个答案:

答案 0 :(得分:16)

Typescript 1.4现在支持联合类型

当然,您仍然需要检查函数内部的值并做出相应的反应,但现在您可以在不必将类型更改为any的情况下进行编译时检查。

function f(x: number | number[]) {
  if (typeof x === "number") {
    return x + 10;
  }
  else {
    // return sum of numbers
  }
}

http://blogs.msdn.com/b/typescript/archive/2015/01/16/announcing-typescript-1-4.aspx

答案 1 :(得分:2)

不幸的是,Typescript不支持联合类型,不太可能这样做in the near future

线程中有两条建议:

  1. 功能重载
  2. 泛型
  3. 在给定的代码段中,我无法看到避免any类型。但是,在代码片段之外,如果toolbar参数作为参数传递,则函数重载可能能够表达这些参数的类型。

答案 2 :(得分:1)

您可以建模工具栏是一个数组一个字符串。

interface ArrayAndString extends Array, String { }
var toolbar: ArrayAndString = editor.config.toolbar;

这表示数组和字符串操作都是合法的,这不是真的,并且没有比any更好的安全性。没有办法模拟它可以是一个或另一个但不是两者。