【发布时间】:2021-10-11 18:19:40
【问题描述】:
我有一个有类型参数的类,C:
import { EventEmitter } from "events";
interface ClientData {
a: string;
b?: string;
}
interface ClientOptions {
b?: string;
}
class Client<C extends ClientData> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // string
console.log(clientData.b); // string | undefined
}
}
const client = new Client({
a: "example",
b: "placeholder"
});
/**
* Client<{
* a: string;
* b: string;
*}>
*/
type ClientType = typeof client;
该类的构造函数采用ClientData 类型的参数,其中输入的类型变为C 类型参数。正如ClientType 所见,这工作正常。
但是,我需要C 类型只包含ClientData 的属性子集,在本例中为ClientOptions,并且它需要具有{} 的默认值:
class Client<C extends ClientOptions = {}> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // Property 'a' does not exist on type 'C'
console.log(clientData.b); // string | undefined
}
}
这里的问题是构造函数中的clientData 参数将不再具有ClientData 中的a 属性。由于构造函数不能有类型参数,我怎么能让clientData 是ClientData 类型,但还要确保C 类型扩展ClientOptions,默认为{}? ClientOptions 的所有属性都是可选的,并且存在于 ClientData 中。
【问题讨论】:
标签: javascript typescript types generic-type-parameters