在TypeScript中处理“类型参数”的变量数量

时间:2019-02-06 00:08:28

标签: javascript typescript

目标是创建一个完全类型安全的泛型类,例如下面的Table类,这将允许创建一个Table实例,其字段类型作为类型参数(或任何其他可能的方式)给出。

let userTable = new Table<number, string, string>(
  columnNames: ["id", "name", "address"],
  fields: [
    [0, "John", "225 Main"],
    [1, "Sam", "330 E Park"]
  ]);
let billsTable = new Table<number, Date, Date>(
  columnNames: ["custId", "invoiceDate", "dueDate", "balance"],
  fields: [ [1, new Date(), new Date()] ]);

问题是,出于对全类型安全的关注,您将如何定义或实现这样的泛型类型结构,该泛型类型结构可能具有数量未知的类型参数?

1 个答案:

答案 0 :(得分:0)

您可以使用元组作为类型参数:

class Table<T extends string, U extends any[]> {
  constructor(columnNames: T[], fields: U[]) {
    /* Do something */
  }
}

如果您明确提供类型参数,则将对它们进行参数类型检查。

new Table<'custId' | 'invoiceDate', [string, number, Date]>(
  ['custId', 'invoiceDate'],
  [
    ['foo', 1, new Date()],
    ['bar', 2, new Date()],
  ]
)

还可以使用命名参数:

class Table<T extends string, U extends any[]> {
  constructor(configuration: { columnNames: T[], fields: U[]}) {
    /* Do something */
  }
}

new Table<'custId' | 'invoiceDate', [string, number, Date]>({
  columnNames: ['custId', 'invoiceDate'],
  fields:[
    ['foo', 1, new Date()],
    ['bar', 2, new Date()],
  ]
})