类型“StyleSheet”上不存在属性“addRule”和“insertRule”

Posted

技术标签:

【中文标题】类型“StyleSheet”上不存在属性“addRule”和“insertRule”【英文标题】:Property 'addRule' and 'insertRule' does not exist on type 'StyleSheet' 【发布时间】:2017-12-07 10:14:13 【问题描述】:

我有如下打字稿代码:-

export function getRootWindow():Window 
    return window.top;


export function getRootDocument():htmlDocument 
    return getRootWindow().document;



declare global 
    interface Document 
        documentMode?: any;
    



export function isBrowserIE() 
    return getRootDocument().documentMode;


export function addCssRule(cssString:string, num:number) 
    let isIE = isBrowserIE();

    if(getRootDocument().styleSheets[0] == undefined) 
        let head  = getRootDocument().head || getRootDocument().getElementsByTagName('head')[0];
        let style = getRootDocument().createElement('style');

        head.appendChild(style);
    

    if(isIE) 
        getRootDocument().styleSheets[0].addRule(cssString,num);
    else 
        getRootDocument().styleSheets[0].insertRule(cssString,num);
    

这段代码在 javascript 中运行良好:-

<!DOCTYPE html>
<html>
<head>

</head>
<body style="color: #fff; font-family: arial, sans-sarif; background-color: #333; text-align: center;">

<h2>My mute speaker</h2>

<a href="#" class="datawrkz_speaker">
  <span></span>
</a>

<script>

    if(document.styleSheets[0] == undefined) 
        var head  = document.head || document.getElementsByTagName('head')[0];
        var style = document.createElement('style');

        head.appendChild(style);
    

    
    var datawrkz_speaker     = document.getElementsByClassName("datawrkz_speaker")[0];

    datawrkz_speaker.addEventListener("click", function() 
        this.classList.toggle("mute");            
    );

    function addCssRule(cssString, num) 
        var isIE = /*@cc_on!@*/false || !!document.documentMode;

        if(isIE) 
            document.styleSheets[0].addRule(cssString, num);
        else 
            document.styleSheets[0].insertRule(cssString,num);
        
        
    

    // set css rules as below for mute button

   addCssRule(".datawrkz_speaker height: 30px; width: 30px; position: relative; overflow: hidden; display: inline-block; ", 0);

    addCssRule(".datawrkz_speaker span display: block; width: 8px; height: 8px; background: #fff; margin: 11px 0 0 2px; ", 1);

    addCssRule(".datawrkz_speaker span:after content: ''; position: absolute; width: 0; height: 0; border-style: solid; border-color: transparent #fff transparent transparent; border-width: 10px 14px 10px 15px; left: -13px; top: 5px;", 2);

    addCssRule(".datawrkz_speaker span:before transform: rotate(45deg); border-radius: 0 50px 0 0; content: ''; position: absolute; width: 5px; height: 5px; border-style: double; border-color: #fff; border-width: 7px 7px 0 0; left: 18px; top: 9px; transition: all 0.2s ease-out; ", 3);

    addCssRule(".datawrkz_speaker:hover span:before transform: scale(0.8) translate(-3px, 0) rotate(42deg); ", 4);
    
    addCssRule(".datawrkz_speaker.mute span:before transform: scale(0.5) translate(-15px, 0) rotate(36deg); opacity: 0; ", 5); 
    

</script>

</body>
</html>

我在 Typescript 中遇到错误(上面的第一个代码 sn-p):-

一个。类型“StyleSheet”上不存在属性“addRule”

b.类型“StyleSheet”上不存在属性“insertRule”

【问题讨论】:

这是一个编译器错误。在 IDE 中它显示 CSSStyleSheet,但在编译时它使用 StyleSheet,它没有方法。如果您遇到转换错误,请将其转换为 any 然后 CSSStyleSheet(即 document.styleSheets[0] as any as CSSStyleSheet) 【参考方案1】:

这是因为 StyleSheet 类型确实缺少 addRule 和 insertRule 方法。这些方法是在CSSStyleSheet 类型上定义的。

你可以说 typescript 你真的知道类型是CSSStyleSheet,而不是预测的StyleSheet,方法是强制打字并在 addRule 调用中对 num 添加 .toString 调用(因为它需要打字)。

有两种可能的语法来做到这一点。

if (isIE) 
    (getRootDocument().styleSheets[0] as CSSStyleSheet).addRule(cssString, num.toString());
 else 
    (getRootDocument().styleSheets[0] as CSSStyleSheet).insertRule(cssString, num);

替代语法

if (isIE) 
    (<CSSStyleSheet>getRootDocument().styleSheets[0]).addRule(cssString, num.toString());
 else 
    (<CSSStyleSheet>getRootDocument().styleSheets[0]).insertRule(cssString);

【讨论】:

类型断言对我有用。做的有点不对。

以上是关于类型“StyleSheet”上不存在属性“addRule”和“insertRule”的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:类型“”上不存在属性

错误 TS2339:类型“”上不存在属性“包含”

类型“”上不存在属性“forEach”

类型“T”上不存在属性 - 一般问题

类型“”上不存在 Typescript 错误属性“成员”

“EventTarget”类型上不存在属性“值”