我有以下代码片段,我的问题是如何保留knowLiteral的文字类型信息,而不必像我现在所做的那样拼写出类型?
// @ts-check
/**
* @typedef {Readonly<Record<string, string>>} ReadonlyStringRecord
*/
/**
* @template {ReadonlyStringRecord} T
*/
class Main {
/**
* @param {T} knowLiteral
*/
constructor(knowLiteral) {
/**
* @readonly
* @type {T}
*/
this.knowLiteral = knowLiteral;
}
}
// how not to have to write this?
/**
* @extends {Main<{
* this_is_know: '42'
* }>}
*/
class Main2 extends Main {
constructor() {
const knowLiteral = /** @type {const} */ ({ 'this_is_know': '42' });
super(knowLiteral);
}
testFunc() {
//this should (and does) error.
let x = this.knowLiteral.this_is_not_defined;
}
}
为了在扩展 Main 类时保留 KnowLiteral 的文字类型信息而不手动拼出类型,您可以利用 TypeScript 的功能从常量对象推断类型。您可以通过将文字定义为 const 对象并让 TypeScript 自动推断类型来实现此目的。