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

时间:2016-01-08 09:28:20

标签: typescript

有可能在打字稿中以某种方式使可能为空的界面与字符串不兼容?

interface IA {
    foo?:number;
}

function bar(arg:IA) {
}

bar("should not compile");

Playground link

稍后添加:

更复杂的示例,可能的解决方法以不同的方式进行限制(您只能扩展类或接口):

interface IACommon {
    common?:number;
    f1?:string;
    f2?:any;
}

interface IAWithF1 extends IACommon {
    f1:string;
}

interface IAWithF2 extends IACommon {
    f2:any;
}

type IA = IAWithF1 | IAWithF2;

function bar(arg:IA) {
}

bar("does not compile but next definition also does not compile");

interface IAExtended extends IA {
    ext?: any;
}

Playground link

在此我发现只有IAExtendedIACommon扩展的解决方法,但这使得IAExtended也无法通过传递字符串而不是对象来防止此错误。

3 个答案:

答案 0 :(得分:2)

TS 2.2的新功能允许这个很好的问题解决方案:

interface IACore {
    foo?: number;
}

type IA = IACore & object;

function bar(arg:IA) {
}

bar("does not compile in TS 2.2.");

答案 1 :(得分:0)

您可以通过设置密钥的类型使您的界面成为字典类型:

interface IA {
    [key: string]: any;
    foo?:number;
}

function bar(arg:IA) {
}

bar("wont compile");

Playground link

答案 2 :(得分:0)

我想我在这里有更好的答案(万一有人来看)。我有类似的情况,但我不打算表明这一点。让我们回到你原来的情况。找到一个只有轻微变化的解决方案。

我的版本生成错误(至少从TS 2.1.4开始):

interface IA {
    foo: number | undefined;
}

function bar(arg:IA) {
}

bar("should not compile");

我在这里看到的唯一语义差异是你实际上必须在所有对象文字中提供foo的值,例如

bar({}); // Error
bar({ foo: undefined }); // OK
bar({} as IA); // Also OK

您可以在这一点here找到一些讨论。