Interface 在TypeScript中设置所需的属性

Interface 在TypeScript中设置所需的属性,interface,typescript,redux,Interface,Typescript,Redux,在TypeScript中,将某些属性标记为所需的适当方法是什么?假设我们有某个对象,该对象必须包含id字段,但也可以包含任意多的其他字段: interface SomeType { id: number; } let obj: SomeType = { name: "OBJ" }; // GOOD ERROR! We must have `id` let obj: SomeType = { id: 123 }; // OK let obj

在TypeScript中,将某些属性标记为所需的适当方法是什么?假设我们有某个对象,该对象必须包含id字段,但也可以包含任意多的其他字段:

interface SomeType {
    id: number;
}

let obj: SomeType = { name: "OBJ" };           // GOOD ERROR! We must have `id`
let obj: SomeType = { id: 123 };               // OK
let obj: SomeType = { id: 123, name: "OBJ" };  // BAD ERROR! I just want to add a name
我知道您可以使用问号创建可选属性,如下所示:

interface SomeType {
    id: number;
    name?: string;
    engine?: string;
    mother?: string;
}
但我不希望每次都通过添加和混合不相关的东西来修改这个界面

当然,另一种选择是创建一组接口,每个接口都扩展了主接口,但这听起来像是一大堆代码:

interface SomeType {
    id: number;
}

interface FirstType extends SomeType {
    name: string;
}
起初我试着这样做:

interface SomeType extends any {
    id: number;
}
但是TypeScript找不到name
any
。也许有像这样的带感叹号的东西

interface SomeType {
    id!: number;
}
更新

我在创建操作时使用这种类型的接口,操作必须具有属性
type
和任何数量的其他附加属性。确实有很多动作,所以我不愿意使用
any
作为一种类型。

试试下面的方法

interface SomeType {
    id: number;
    [key: string]: any;
}
您可以使用以下方法:

interface SomeType {
    id: number;
    [key: string]: any;
}

let obj1: SomeType = { name: "OBJ" };           // GOOD ERROR! We must have `id`
let obj2: SomeType = { id: 123 };               // OK
let obj3: SomeType = { id: 123, name: "OBJ" };  // OK
[]

但是,请注意,即使以下代码(即带有非字符串属性键)对上述索引器也是有效的:

let obj4: SomeType = { id: 123, 1: "OBJ" }; // also OK
这让人困惑,但事实就是如此

但我不希望每次都通过添加和混合不相关的东西来修改这个界面

不要在同一界面中添加或混合不相关的内容。创建单独的接口,然后在必要时使用交叉点类型将其合并

interface FirstType {
    id: number;
}

interface SecondType {
    name: string;
}

let myIntersectionObj: FirstType & SecondType = {
    id: 2,
    name: "some string"
};
这在以下情况下很有用:

function myFirstFunction(obj: FirstType) { /* does something */ }
function mySecondFunction(obj: SecondType) { /* does something */ }

function myFunction(obj: FirstType & SecondType) {
    myFirstFunction(obj);
    mySecondFunction(obj);
}

myFunction(myIntersectionObj);

使用交集类型有助于确保在应用程序中键入所有内容,这将有助于防止错误。索引类型最好只用于键值对象。

“设置所需属性”-您确定要这样做吗?在我看来,您更希望定义一个类型,该类型具有一些(必需)属性,但允许任何数量的其他以前未定义的属性。请显示您实际希望如何使用此类型的用法,以便我们了解您希望这样做的目的。这不应该令人混淆,因为JavaScript对象只有stringy键,并且对象中的数字1隐式转换为stringy 1。使用
obj4
,如果运行
Object.keys(obj4.map)(key=>typeof key)
,您将看到一个仅包含
字符串的数组。