Javascript条件内部TypeScript接口

Jon*_*amb 4 javascript typescript

是否可以在TypeScript中的接口声明中包含条件.我正在寻找的是一种方式,根据第一个键的值,第二个键可以是这些值.

示例(不起作用):

interface getSublistValue {

    /** The internal ID of the sublist. */
    sublistId: 'item' | 'partners';

    /** The internal ID of a sublist field. */
    if (this.sublistId === 'item') {
        fieldId: 'itemname' | 'quantity';
    }

    if (this.sublistId === 'partners') {
        fieldId: 'partnername' | 'location';
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ret 6

不,没有.最好的办法是创建描述两种不同类型数据的独立接口.

例如:

interface SublistItem {
    sublistId: 'item';
    fieldId: 'itemname' | 'quantity';
}

interface SublistPartners {
    sublistId: 'partners';
    fieldId: 'partnername' | 'location';
}

function getData(): SublistItem | SublistPartners {
    return (Math.random() < 0.5)
        ? { sublistId: 'item', fieldId: 'itemname' }
        : { sublistId: 'partners', fieldId: 'partnername' };
}

const someValue = getData();

if (someValue.sublistId === "item") {
    // SublistItem in here
}
else {
    // SublistPartners in here
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*lin 6

如果你想完全分离你的接口,你可以这样做:

例如。子列表.model.ts

interface SublistItem {
    sublistId: 'item';
    fieldId: 'itemname' | 'quantity';
}

interface SublistPartners {
    sublistId: 'partners';
    fieldId: 'partnername' | 'location';
}

export type Sublist = SublistItem | SublistPartners;
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 Sublist 类型,它会根据您提供的字段值正确推断它是 SublistPartners 类型还是 SublistItem 类型。