如何使可能为空的接口与TypeScript中的字符串不兼容

如何使可能为空的接口与TypeScript中的字符串不兼容,typescript,Typescript,在typescript中,是否可能以某种方式使空接口与字符串不兼容 interface IA { foo?:number; } function bar(arg:IA) { } bar("should not compile"); 稍后添加: 更复杂的示例,可能存在以不同方式限制的变通方法(您只能扩展类或接口): 在这篇文章中,我只找到了从IACommon扩展IAExtended的解决方法,但这使得IAExtended也无法通过传递字符串而不是对象来防止此错误。您可以通过设置键

在typescript中,是否可能以某种方式使空接口与字符串不兼容

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.");