TypeScript 接口 [key: string]

car*_*los 1 typescript

我正在尝试编写一个接口,但它不断弹出一个错误:

"Property 'success' of type 'boolean' is not assignable to string index type 'PageableLaravel'

export interface PageableLaravel {
    path: string;
    current_page: number;
    from: number;   
}


export interface Pageable {
    success: boolean; // <-"Property 'success' of type 'boolean' is not assignable to string index type 'PageableLaravel'
    message: string; // "Property 'message' of type 'string' is not assignable to string index type 'PageableLaravel'
    [key: string]: PageableLaravel
}
Run Code Online (Sandbox Code Playgroud)

[key: string]会随时更改,例如:下面是从API返回的JSON的例子

{
    success: true,
    message: 'success',
    pages: {//<-key name always will change
        path: "XX"
        //etc
    }
}

{
    success: true,
    message: 'success',
    products: {//<-key name always will change
        path: "XX"
        //etc
    }
}

{
    success: true,
    message: 'success',
    brands: {//<-key name always will change
        path: "XX"
        //etc
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法声明一个可能/可能不总是改变的密钥?

Tim*_*rry 6

不幸的是,您使用的索引签名语法不允许这样做。当您添加索引签名 ( [key: string]: PageableLaravel) 时,这意味着所有属性都必须是 PageableLaravel,而不仅仅是所有未指定的属性。

您可以使用交集类型解决此问题:

export interface PageableLaravel {
    path: string;
    current_page: number;
    from: number;   
}

export type Pageable = {
    success: boolean;
    message: string;
} & {
    [key: string]: PageableLaravel
}
Run Code Online (Sandbox Code Playgroud)

TypeScript 游乐场演示

  • 您可能要提到的是,交集类型不健全,您将很难为其分配具体值。这是人们解决这个问题的方法之一,但它是一种有警告的解决方法。 (3认同)