2017-06-22 91 views
1

我想通过ts声明两种类型的变量,但编译器提示错误。 这样的:如何通过打字稿声明两种类型的变量

interface IAnyPropObject { 
 
    [name: string]: any; 
 
} 
 
let a: IAnyPropObject | ((str: string) => any); 
 
a.B = "bbbbbbbb";//tips error 
 
a("");//tips error

注:我不想通过这种方式only.Because代码的使用“任意”到declare.I只是想约束变量是如此旧的,他们不是TS码。

+1

** ** ** **类型的变量? **二**?!所以,你说的是,在TypeScript中,一个变量可以同时是一个字符串和一个整数。这怎么可能? **这太疯狂了**! – 2017-06-22 02:03:30

+0

TS支持union类型。我只想通过这种方式来约束变量。 –

+0

@Mango,就像你可以同时成为男性和女性一样。 – Rudy

回答

1

Mixin vs Union类型的简要说明。

联盟:可以是thisthat类型,但不是两者都有。

interface A { [name: string]: any; } 
interface B { (str: string): string; } 
type UnionType = A | B; 

密新:的this混合,并在同一时间that类型。

interface A { [name: string]: any; } 
interface B { (str: string): string; } 
type MixinType = A & B; 

如果您使用Mixin类型,如果这是您的意图,您的代码将工作。变量a可以同时混合使用两种类型。

+0

要使用&,OP必须传递两种类型的东西,即满足两个接口;在这种情况下,函数是一个对象,所以它几乎是真的,除了可以使用数字通过括号来设置函数属性,这不应该由OP给出的定义来允许。你可能通过什么样的对象来正确实现这两个接口? –

+0

yeah.I可以省略'if ...' –

+0

感谢您清除此问题! +1欣赏它。 – 2017-06-22 17:00:12

3

如果您使用OR类型,这并不意味着您的对象同时具有两种类型,您必须对其进行测试并在测试中使用正确的类型。

https://www.typescriptlang.org/docs/handbook/advanced-types.html

interface IAnyPropObject { [name: string]: any; } 
type MyFunc = (str: string) => any; 
let a: IAnyPropObject | ((str: string) => any); 
if (a instanceof Function) { 
    (<MyFunc>a)("hi"); //passing a number will throw an error 
} else { 
    (<IAnyPropObject>a).b = 'bbbbbbbb'; 
} 

你也可以创建一个自定义类型的后卫,但我挂的文件中解释真实,那么你就不会投了。还有很多需要说的,我只是从我的手机回答中摸索表面,阅读文档了解所有细节。

+0

,你的答案是正确的。很感谢。 –

+0

感谢您清理这个! +1欣赏它。 – 2017-06-22 17:00:16