在打字稿中,我想在一个物体上运行一些代码,我知道它有两个属性,分别为includeUnassignedLocations
和contractStatusCodes
(分别有KnockoutObservable<boolean>
和KnockoutObservableArray<number>
)。有各种不同的类可以使用,但我不想让它们都实现一个接口,因为它们彼此完全不同。有没有办法让打字稿检查传入方法的任何对象是否具有这些属性?在打字稿中,如何根据其属性指定类型,而不是界面?
0
A
回答
1
实际上你可以依赖对象的隐式接口。
假设您有一个名为MyKnockoutClass
的类,其中包含includeUnassignedLocations
和contractStatusCodes
。您还定义了具有这两个属性的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);
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. 如何在打字稿的界面属性中定义一个类?
- 2. 在打字稿中定义类属性类型?
- 3. 如何在使用打字稿界面时处理原型类
- 4. 打字稿是否有空白界面的标准类型?
- 5. 属性“滑块”不存在类型'JQuery'与打字稿
- 6. 界面是否可以要求属性,但不指定所需的类型?
- 7. 如何通过在属性值的变量,而在打字稿
- 8. 如何指定打字稿函数参数数组类型
- 9. 如何解决打字稿错误TS2339:属性'XXX'不存在类型'IntrinsicAttributes&...?
- 10. 如何删除打字稿警告:属性“长”的类型不存在“{}”
- 11. 打字稿不是类型转换
- 12. 打字稿 - 指定类型的多种类型
- 13. 打字稿错误:属性“...”缺失型“...”
- 14. 打字稿 - 指定类型的对象是不分配给通用型
- 15. 如何在打字稿中创建不同的数字类型?
- 16. 使用RTTI指定属性而不知道属性是什么类型
- 17. 在C++中声明变量而不指定其数据类型
- 18. 在打字稿映射类型更改属性名称
- 19. 打字稿@类型/在packages.json
- 20. 如何在界面中获取属性的类型c#
- 21. 从打字稿中的基类泛型推断子类属性类型
- 22. 如何在打字稿类型中定义默认值
- 23. 指定变量的类型在打字稿
- 24. 属性未定义的打字稿
- 25. 打字稿类型兼容性测试
- 26. 如何在打字稿中引用下划线而不是lodash
- 27. 如何根据其href属性在页面中找到链接?
- 28. 打字稿功能,如果类型是不能分配给自定义类型
- 29. 如何将属性添加到打字稿中的现有类型?
- 30. 错误打字稿文件属性selectpicker不上型IInstance存在
我认为这听起来像比我发布的解决方案更好的做法,谢谢。这当然是更好的语法,并且有一个接口名称意味着更容易阐明属性的用途。 – Tim