我有一个类,它有一个类型参数,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
中。
通过使用Partial
:
class Client<C extends Partial<ClientData>> extends EventEmitter {
constructor(clientData: C) {
super();
console.log(clientData.a); // string
console.log(clientData.b); // string | undefined
}
}