如何使可能为空的接口与TypeScript中的字符串不兼容
在typescript中,是否可能以某种方式使空接口与字符串不兼容如何使可能为空的接口与TypeScript中的字符串不兼容,typescript,Typescript,在typescript中,是否可能以某种方式使空接口与字符串不兼容 interface IA { foo?:number; } function bar(arg:IA) { } bar("should not compile"); 稍后添加: 更复杂的示例,可能存在以不同方式限制的变通方法(您只能扩展类或接口): 在这篇文章中,我只找到了从IACommon扩展IAExtended的解决方法,但这使得IAExtended也无法通过传递字符串而不是对象来防止此错误。您可以通过设置键
interface IA {
foo?:number;
}
function bar(arg:IA) {
}
bar("should not compile");
稍后添加:
更复杂的示例,可能存在以不同方式限制的变通方法(您只能扩展类或接口):
在这篇文章中,我只找到了从
IACommon
扩展IAExtended
的解决方法,但这使得IAExtended
也无法通过传递字符串而不是对象来防止此错误。您可以通过设置键的类型,使界面成为字典类型:
interface IA {
[key: string]: any;
foo?:number;
}
function bar(arg:IA) {
}
bar("wont compile");
我想我这里有一个更好的答案(以防有人来看)。我也有过类似的情况,但我不会费心去表现出来。让我们回到你原来的案子。A找到了一个只需稍作改变的解决方案 我的版本生成错误(至少从TS 2.1.4开始): 我在这里看到的唯一语义差异是,实际上您必须始终在所有对象文本中为
foo
提供一个值,例如
您可以找到关于这一点的一些讨论。TS 2.2的新功能可以很好地解决问题:
interface IACore {
foo?: number;
}
type IA = IACore & object;
function bar(arg:IA) {
}
bar("does not compile in TS 2.2.");
不。据我记忆所及,它是从这个PR开始的。你能将你的代码转换为使用
类
而不是接口
作为解决方法吗?不,它需要只是对象,但有多个成员,只允许一些成员组合,所以我可能可以创建联合类型…是的,可能。如果您想获得此问题的有用答案,请添加更多详细信息。否则,简单的“否”是正确答案;)增加了解决方法。一天后我会接受“不”的回答:-)有趣。当然,这对我一点帮助都没有,因为它允许大量的其他bug。但它回答了我最初的问题。
interface IA {
foo: number | undefined;
}
function bar(arg:IA) {
}
bar("should not compile");
bar({}); // Error
bar({ foo: undefined }); // OK
bar({} as IA); // Also OK
interface IACore {
foo?: number;
}
type IA = IACore & object;
function bar(arg:IA) {
}
bar("does not compile in TS 2.2.");