在typescript中,如何根据其属性而不是接口指定类型?

时间:2017-02-24 10:39:49

标签: typescript

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);