提取接口函数参数的字符串文字类型

问题描述 投票:0回答:1

@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 作为字符串文字,而不仅仅是“字符串”?

typescript types type-conversion backend phantomjs
1个回答
0
投票

如果这是该函数的唯一签名,那么您所做的就是正确的。问题在于 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>;

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/ced533042db1b1663be0397fca6e2382dbcbf263/types/phantom/index.d.ts#L196-L226

© www.soinside.com 2019 - 2024. All rights reserved.