这是我喜欢的类型:
type Person = {
name: string;
age: number;
};
type Recordable = Record<string, number | string | boolean>;
interface Column<T extends Recordable> {
data: T;
dataIndex?: string | number;
}
interface MyColumn<T extends Recordable> extends Column<T> {
dataIndex: keyof T; // Error: Type 'keyof T' is not assignable to type 'string | number | undefined'.
}
TS编译器说此类型‘key of T’不能赋值给类型‘字符串|数字|未定义’.
当然,我可以对其进行重构:
interface MyColumn<T extends Recordable> extends Omit<Column<T>, 'dataIndex'> {
dataIndex: keyof T;
}
但是,这将导致‘dataIndex’不受列约束.
我想将"dataIndex"的值约束为"Person"的属性,如下所示:
const jack: MyColumn<Person> = {
data: { name: 'Jack', age: 1 },
dataIndex: 'name', // name, age
};
最新情况:
我已经重构了代码,请参见ts playground.
我将interface
转换为type
,并使用Extract
将dataIndex
的类型指定为string
.然而,在例2.2中,dataIndex
提示Type 'string' is not assignable to type 'Extract<keyof T, string>'
,但在例2.1中,这是可以的.在这种情况下,是否无法推断Extract<keyof T, string>
是string
还是never
?