在@types/phantom中有一个WebPage界面,其中包含以下功能:
interface WebPage {
// ...
property(
key:
| "content"
| "plainText"
| "focusedFrameName"
| "frameContent"
| "frameName"
| "framePlainText"
| "frameTitle"
| "libraryPath"
| "offlineStoragePath"
| "title"
| "url"
| "windowName",
): Promise<string>;
}
我正在尝试提取“key”的属性并将其用于泛型。
我期待以下内容:
async getPageProperty<T extends Parameters<WebPage["property"]>[0]>(url: string, property: T){
// ...
}
将“key”参数的类型解释为
"content" | "plainText" | "focusedFrameName" | ...
,但是,令我惊讶的是,我得到:
(type parameter) T in PhantomJS.getPageProperty<T extends string>(url: string, property: T): Promise<T>
.
有没有办法正确输入 T 作为字符串文字,而不仅仅是“字符串”?
如果这是该函数的唯一签名,那么您所做的就是正确的。问题在于 phantom 的类型对
property
有多个重载,而不仅仅是您提供的那个。因此,提取的类型是 key
所有可能类型的并集,其中一些类型的 key
简单地称为 string
。
property(key: "framesName" | "pagesWindowName" | "pages"): Promise<string[]>;
property(key: "canGoBack" | "canGoForward" | "navigationLocked" | "ownsPages"): Promise<boolean>;
property(key: "framesCount" | "offlineStorageQuota" | "zoomFactor"): Promise<number>;
property(key: "clipRect"): Promise<{
top: number;
left: number;
width: number;
height: number;
}>;
property(key: "cookies"): Promise<ICookie[]>;
property(key: "customHeaders"): Promise<{ [key: string]: string }>;
property(key: "paperSize"): Promise<IPaperSizeOptions>;
property(key: "scrollPosition"): Promise<{ top: number; left: number }>;
property(key: "viewportSize"): Promise<{ width: number; height: number }>;
property<T>(key: string): Promise<T>;
property<T>(key: string, value: T): Promise<void>;