TypeScript 2.4.1 -> fontWeight -> 类型 'number' 不可分配给类型 '"inherit" | 400 |

Posted

技术标签:

【中文标题】TypeScript 2.4.1 -> fontWeight -> 类型 \'number\' 不可分配给类型 \'"inherit" | 400 |【英文标题】:TypeScript 2.4.1 -> fontWeight -> Type 'number' is not assignable to type '"inherit" | 400 |TypeScript 2.4.1 -> fontWeight -> 类型 'number' 不可分配给类型 '"inherit" | 400 | 【发布时间】:2018-03-17 03:40:31 【问题描述】:

当我尝试在 TypeScript 中设置 fontWeight 时出现此错误:

Types of property 'test' are incompatible.
    Type ' fontWeight: number; ' is not assignable to type 'Partial<CSSProperties>'.
        Types of property 'fontWeight' are incompatible.
            Type 'number' is not assignable to type '"inherit" | 400 | "initial" | "unset" | "normal" | "bold" | "bolder" | "lighter" | 100 | 200 | 30...'.

即使400 是一个正确的数字,它也可以是任何数字,因此我得到了我理解的错误。我可以将此错误跟踪到 React.CSSProperties,它指定 fontWeight 应如下所示:

fontWeight?: CSSWideKeyword | "normal" | "bold" | "bolder" | "lighter" | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;

我不能设置test: React.CSSProperties

const styles = (theme: Theme) => (
    test: 
        fontWeight: 400
    
);

我可以这样做,但这不是 Material UI 处理类的方式。

const test: React.CSSProperties = 
    fontWeight: 400

完整代码:

import * as React from "react";
import * as ReactDOM from "react-dom";
import * as ReactRouter from "react-router";
import  withRouter  from "react-router-dom";
import  withStyles  from 'material-ui/styles';
import Badge from 'material-ui/Badge';
import Grid from 'material-ui/Grid';
import  Theme  from 'material-ui/styles';

interface IState 
    userName: string;


interface IProps 
    history?: any;
    classes?: any;


const styles = (theme: Theme) => (
    test: 
        fontWeight: 400
    
);

class Menu extends React.Component<IProps, IState> 
    constructor(props: IProps) 
        super(props);
        this.state = 
            userName: localStorage.userName ? 'userName ' + localStorage.userName : "",
        
    
    render() 
        return (
            <div>
                <Grid container spacing=24>
                    <Grid item xs=12 className=this.props.classes.test>
                    <span>Test</test>
                    </Grid>
                </Grid>
            </div>
        );
    

【问题讨论】:

【参考方案1】:

解决了:

const styles = (theme: Theme) => (
    test: 
        fontWeight: 400
     as React.CSSProperties
);

【讨论】:

为您的函数添加返回类型而不是将其强制转换为类型,将允许编译器验证类型而不是强制它。 @JohanLindskogen 主题来自 Material-UI,它本身使用 JSS。主题期待 React.CSSProperties,否则将给出上述不兼容的异常。必须为方法中的每个新对象设置它。 哦,我明白了。 Material-UI 现在建议使用createStyles 函数顺便说一句,material-ui.com/guides/typescript【参考方案2】:

目前接受的这个问题的答案只是一种解决方法。解决这个问题的正确方法是使用 Material-UI 中的createStyles 函数。

const styles = (theme: Theme) => createStyles(
    test: 
        fontWeight: 400
    
);

请参阅material UI documentation。

【讨论】:

以上是关于TypeScript 2.4.1 -> fontWeight -> 类型 'number' 不可分配给类型 '"inherit" | 400 |的主要内容,如果未能解决你的问题,请参考以下文章

XSL-FO: fo:marker 可以用来存储任何东西吗?

XSL/FO:在“fo:block”上遇到无效属性:在将 html 转换为 PDF (xhmtml2fo) 时显示(没有可用的上下文信息)

XSL FO 在具体注释之后读取第一个 fo:table 节点

如何检查传递给函数的参数数量是不是错误

将具有相同值的键相乘

XSL-FO 文档:在具体的 fo:table-row 中插入 break-before="page" 属性