目标是创建一个完全类型安全的泛型类,例如下面的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()] ]);
问题是,出于对全类型安全的关注,您将如何定义或实现这样的泛型类型结构,该泛型类型结构可能具有数量未知的类型参数?
答案 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()],
]
})