类型参数不可分配给

Posted

技术标签:

【中文标题】类型参数不可分配给【英文标题】:Argument of type not assignable to 【发布时间】:2018-06-29 14:51:03 【问题描述】:

我有这段代码,它给我一个打字稿错误。

firebaseAdmin.firestore().collection('arenas').get()
    .then((snapshot: any) => 
        snapshot.forEach((element: any) => 
            scraptIt(firebaseFunctions.config().sports.url + element.data().url, 
                sports: 
                    listItem: '.LSport',
                    data: ['b']
                
            ).then((data: any) => 
                sportsArray.push(data)
                sportsArray = [...new Set(data)]
            ).catch((err: any) =>  res.send(err); console.log(err) )
        )
    ).catch((err: any) =>  res.send(err); console.log(err) )

我收到以下错误

类型参数 ' sports: listItem: string;数据:字符串[]; ; ' 不可分配给“ScrapeOptions”类型的参数。属性“sports”与索引签名不兼容。键入'列表项:字符串;数据:字符串[]; ' 不可分配给类型 'string | ScrapeOptionList |刮擦选项元素'。键入'列表项:字符串;数据:字符串[]; ' 与类型 'ScrapeOptionElement' 没有共同的属性。

我正在使用这个包:Scrape-It

【问题讨论】:

【参考方案1】:

您正在使用 Scrapeit 库中的以下方法签名

declare function scrapeIt<T>(url: string | object, opts:scrapeIt.ScrapeOptions): Promise<T>;

这意味着方法scraptIt() 的第二个参数应该是ScrapeOptions 类型。如果您仔细观察接口ScrapeOptions 的定义,您可以看到它接受以下格式作为输入

export interface ScrapeOptions 
        [key: string]: string | ScrapeOptionList | ScrapeOptionElement;

ScrapeOptionList 接口定义为

export interface ScrapeOptionList 
        listItem: string;
        data: ScrapeOptions;

在您的代码中,您将传递第二个参数,如下所示

scraptIt(firebaseFunctions.config().sports.url + element.data().url, 
                sports: 
                    listItem: '.LSport',
                    data: ['b'] // here is the issue
                
            )

根据定义,data 的值应该是 ScrapeOptions 类型。因此,您需要将其更改为简单的字符串或ScrapeOptionList 类型或ScrapeOptionElement 类型。

您可以根据需要尝试将其更改为data: 'b' 或将dataproperty 值设置为ScrapeOptionListScrapeOptionElement 类型。

要使用的示例格式应如下所示——(不确定您为什么使用data:['b'])。在我看来应该是data : "somekey" : 'b'

pages: 
        listItem: "li.page"
      , name: "pages"
      , data: 
            title: "a"
          , url: 
                selector: "a"
              , attr: "href"
            
        
    

【讨论】:

啊,好的,我去看看。这很奇怪,因为我在两个不同的项目和 VS 代码编辑器中有完全相同的代码,只是一个在给出问题,另一个在工作。我认为这可能是 TS Config 或其他东西,因此也会对此进行调查。 我已经尝试了你的建议,但由于某种原因它仍然给我同样的问题。 @DivanvanBiljon 那么这可能是您的本地 tsconfig 问题.. 根据文档,上述实现似乎是正确的。 @DivanvanBiljon 用示例格式更新了我的答案......你为什么要使用data:['b'] for?data 应该是一个内部带有键值对的对象。 @Nilandri 你是对的,我使用的选择器不正确。

以上是关于类型参数不可分配给的主要内容,如果未能解决你的问题,请参考以下文章

构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数

构建:'string | 类型的参数1' 不可分配给“字符串”类型的参数

PhpStorm 警告:参数类型不可分配给参数类型

类型参数不可分配给

JWT:'string | 类型的参数undefined' 不可分配给'Secret' 类型的参数

类型参数 static: boolean; 不可分配给 read?: any 类型的参数