一个方式就是问题中所展示的, 但是不太灵活, 可以使用接口的任意属性:
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
使用 "[propName: string]" 定义了任意属性取 string 类型的值。
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
// index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'.
// index.ts(7,5): error TS2322: Type '{ [x: string]: string | number; name: string; age: number; gender: string; }' is not assignable to type 'Person'.
// Index signatures are incompatible.
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'.
«"http://ts.xcatliu.com/basics/type-of-object-> interfaces.html" (https://link.segmentfault.com/?enc=HTiQkTqmYAJzzXtJJJvNVg%3D%3D.gC07qgJFXbaWfFwkKdIJh8DqIk9sFAL%2BXN3phdTBBOi5zzHaJ%2BR%2FwFFjOqujv%2F4i1tE9SQDRjOVZ6z2ioqVbJw%3D%3D)»