2017-02-24 33 views
0

在打字稿中,我想在一个物体上运行一些代码,我知道它有两个属性,分别为includeUnassignedLocationscontractStatusCodes(分别有KnockoutObservable<boolean>KnockoutObservableArray<number>)。有各种不同的类可以使用,但我不想让它们都实现一个接口,因为它们彼此完全不同。有没有办法让打字稿检查传入方法的任何对象是否具有这些属性?在打字稿中,如何根据其属性指定类型,而不是界面?

回答

1

实际上你可以依赖对象的隐式接口。

假设您有一个名为MyKnockoutClass的类,其中包含includeUnassignedLocationscontractStatusCodes。您还定义了具有这两个属性的MyKnockoutInterface。即使该类没有明确实现接口,它仍然隐含地实现它。因此,任何期望MyKnockoutInterface类型的产品都可以使用MyKnockoutClass

class MyKnockoutClass { 
    includeUnassignedLocations: KnockoutObservable<boolean>; 
    contractStatusCodes: KnockoutObservableArray<number>; 
} 

interface MyKnockoutInterface { 
    includeUnassignedLocations: KnockoutObservable<boolean>; 
    contractStatusCodes: KnockoutObservableArray<number>; 
} 

function doSomething(object: MyKnockoutInterface) { 
} 

var object = new MyKnockoutClass(); 
doSomething(object); 
+1

我认为这听起来像比我发布的解决方案更好的做法,谢谢。这当然是更好的语法,并且有一个接口名称意味着更容易阐明属性的用途。 – Tim

2

是的,您可以使用对象文字符号而不是接口来指定类型。如果getMyObject()的结果不具有这两个属性,或者属性本身具有错误的类型,则以下代码将提供打印字体错误。

var myObject: { 
    //this can be any type which implements these properties 
    includeUnassignedLocations: KnockoutObservable<boolean>, 
    contractStatusCodes: KnockoutObservableArray<number>; 
}; 

myObject = getMyObject(); 

//do something with myObject here, safe in the knowledge it has those two properties 
相关问题