打字稿是不是允许接口和字符串联合类型?
Posted
技术标签:
【中文标题】打字稿是不是允许接口和字符串联合类型?【英文标题】:Does typescript allow interface and string union types?打字稿是否允许接口和字符串联合类型? 【发布时间】:2018-12-07 00:41:22 【问题描述】:我正在尝试实现一个类似的方法,该方法采用一个关键参数,即string
或可索引类型接口IValidationContextIndex
的实例。实现如下所示:
/**
* Gets all ValidationContext container values.
* @returns An array of ValidationContext instances contained in the cache.
*/
public static getValidationContextValues(key: IValidationContextIndex | string ): Array<ValidationContext>
if (key instanceof IValidationContextIndex ) [
return Object.values(<any> key);
]
else
const vci = ValidationContainer.cache[<string>key];
return Object.values(<any> vci);
Typescript 为 if
块提供以下错误:
[ts] 'IValidationContextIndex' 仅指一种类型,但在这里用作值。
关于如何解决这个问题的任何想法?
对于大多数界面,我认为可以添加type
属性(type: 'IValidationContextsIndex'
;
),但在这种情况下不起作用,因为接口是可索引类型的接口 ....
【问题讨论】:
你可以使用任何类型 如果我执行key: any
并执行 instanceof 检查,我仍然会收到相同的错误...
请记住,一旦您转译为 javascript,接口和类型就会消失。这些用于您的代码检查和 linting。不是为了你的最终结果。
是的,我理解那部分 - 基本上界面已经消失了,所以 Typescript 就像“伙计,我没有......”
也许这会有所帮助:***.com/a/40718205/1497533
【参考方案1】:
没有一种方法可以在运行时检查 typescript 中的类型,因为几乎所有东西都在转译后变成了一个对象,所以你可能需要按照user-defined typed guards 的定义来做一些事情
【讨论】:
【参考方案2】:我认为这可以做到(根据@indrakumara 的提示):
/**
* Gets all ValidationContext container values fpr a
* Object_property string valued key or a key that is an instance of
* IValidationContextIndex).
* @returns An array of ValidationContext instances contained in the cache that corresponds to a specific Object_property key.
*/
public static getValidationContextValues(key: any ): Array<ValidationContext>
if (typeof key === `string` )
const vci = ValidationContainer.cache[<string>key];
return Object.values(<any> vci);
else
return Object.values(<IValidationContextIndex> key);
【讨论】:
【参考方案3】:typescript 中的接口不会转译为 javascript 中的任何代码。因此,在您的代码“instanceof IValidationContextIndex”中,javascript 中不存在 IValidationContextIndex。
将您的接口更改为类或有一个实现该接口的类,然后检查传递的参数是否是该类的实例。
【讨论】:
检查实例是否为字符串会更容易一些,如果不是,则假设它是接口的实例......所以我作弊了一点,但它很轻量级并且有效.. .我认为当联合类型由多个接口组成时,你的方式会很健壮......以上是关于打字稿是不是允许接口和字符串联合类型?的主要内容,如果未能解决你的问题,请参考以下文章