如何在打字稿中约束值?

时间:2020-09-04 10:18:04

标签: typescript types constraints

An exception has occurred, use %tb to see the full traceback. TypeError: handle_get_file_code() got an unexpected keyword argument 'save_all' 版本:3.9.6

我想限制tsc的值。

在我的界面getColDict()中,键是任何字符串,值必须是ColDict<T>,在我的情况下,T是类型T

我的代码在这里:

Column

我得到了错误:

interface ColDict<T> {
  [i: string]: T;
}

function getColDict<T>(): ColDict<T> {
  return {
    id: { title: 'ID', dataIndex: 'id' },  // **constraint here**
    name: { title: 'NAME', dataIndex: 'name' },  // **constraint here**
    xxx: { title: 'YYY', dataIndex: 'zzz' },  // **constraint here**
  };
}

// =====================================

export type Column = {
  title: string;
  dataIndex: string;
  width: number;
};

const colDict = getColDict<Column>();

const columns: Column[] = [
  { ...colDict.id, width: 80 },
  { ...colDict.name, width: 80 },
  { ...colDict.xxx, width: 80 },
];

console.log('columns: ', columns);

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我可以看到您正在尝试做什么。有几个问题。首先,getColDict()不应是通用的,因为实现中的任何内容都不取决于通用参数。您不会以这种方式强制执行约束。相反,您应该显式定义getColDict()生成的列接口,如果尝试将返回值分配给其他类型的对象,则TS将给您一个错误。看起来像这样:

interface ColDict<T> {
  [i: string]: T;
}

interface ColumnType {
  title: string
  dataIndex: string
}

function getColDict(): ColDict<ColumnType> {
  return {
    id: { title: 'ID', dataIndex: 'id' },  // **constraint here**
    name: { title: 'NAME', dataIndex: 'name' },  // **constraint here**
    xxx: { title: 'YYY', dataIndex: 'zzz' },  // **constraint here**
  };
}

// =====================================

export type Column = {
  title: string;
  dataIndex: string;
  width: number;
};

const colDict: ColDict<Column> = getColDict(); // Error, Property 'width' is missing in type 'ColumnType' but required in type 'Column'.