tru*_*ktr 3 typescript material-ui
我想弄清楚如何注释以下样式的类型(我从纯 JavaScript 转换为 TypeScript 并添加类型注释):
import * as React from 'react'
import { withStyles } from '@material-ui/core'
@withStyles(styles) // TYPE ERROR HERE
export default class App extends React.Component<{}, {}> {
render(): JSX.Element {
return (
<div className="some-class"> Hello </div>
)
}
}
function styles() {
return {
// assume I need to use global styles, my actual project is more
// complex and for some reasons I need to use global styles
'@global': {
'.some-class': {
overflowX: 'hidden'
},
},
}
}
Run Code Online (Sandbox Code Playgroud)
我们如何打字?
起初,它给了我一个错误,如:
Types of property 'overflowX' are incompatible.
Type 'string' is not assignable to type '"scroll" | "hidden" | "visible" | "auto" | "clip" | "-moz-initial" | "inherit" | "initial" | "revert" | "unset" | undefined'.
Run Code Online (Sandbox Code Playgroud)
所以我将其更改为以下使用createStyles:
import * as React from 'react'
import { withStyles, createStyles } from '@material-ui/core'
@withStyles(styles) // TYPE ERROR HERE
export default class App extends React.Component<{}, {}> {
render(): JSX.Element {
return (
<div className="some-class"> Hello </div>
)
}
}
function styles() {
return createStyles({
// assume I need to use global styles, my actual project is more
// complex and for some reasons I need to use global styles
'@global': {
'.some-class': {
overflowX: 'hidden'
},
},
})
}
Run Code Online (Sandbox Code Playgroud)
现在我收到这个错误:
tmp.tsx:5:1 - error TS1238: Unable to resolve signature of class decorator when called as an expression.
Type 'ComponentClass<Pick<{}, never> & StyledComponentProps<"@global">, any>' is not assignable to type 'void | typeof App'.
Type 'ComponentClass<Pick<{}, never> & StyledComponentProps<"@global">, any>' is not assignable to type 'typeof App'.
Type 'Component<Pick<{}, never> & StyledComponentProps<"@global">, any, any>' is not assignable to type 'App'.
Types of property 'render' are incompatible.
Type '() => ReactNode' is not assignable to type '() => Element'.
Type 'ReactNode' is not assignable to type 'Element'.
Type 'undefined' is not assignable to type 'Element'.
5 @withStyles(styles) // TYPE ERROR HERE
~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
在我实际的、更复杂的代码中,错误是类似的,关于无法匹配Component类型:
App.tsx:44:1 - error TS1238: Unable to resolve signature of class decorator when called as an expression.
Type 'ComponentClass<Pick<AppProps, never> & StyledComponentProps<"@global">, any>' is not assignable to type 'void | typeof App'.
Type 'ComponentClass<Pick<AppProps, never> & StyledComponentProps<"@global">, any>' is not assignable to type 'typeof App'.
Type 'Component<Pick<AppProps, never> & StyledComponentProps<"@global">, any, any>' is not assignable to type 'App'.
Property 'makeOnStatusWindowClick' is missing in type 'Component<Pick<AppProps, never> & StyledComponentProps<"@global">, any, any>'.
44 @withStyles(styles)
~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
其中makeOnStatusWindowClick是在我的部件类中定义的非常第一种方法。
Daniel 链接的 Material UI 文档说
不幸的是,由于当前 TypeScript 装饰器的限制, withStyles(styles) 不能用作 TypeScript 中的装饰器。
所以我能够通过做两件事来让它工作:
createStyles我的回报对象styles功能(因此它使用所产生的一个不使用的功能明确的返回类型定义createStyles)withStyles如不装饰器WithStyles你的道具,使用自动检测类型的你styles代码如下所示:
import * as React from 'react'
import { withStyles, WithStyles, createStyles } from '@material-ui/core'
interface Props extends WithStyles<typeof styles> {}
class App extends React.Component<Props, {}> {
render(): JSX.Element {
return (
<div className="some-class"> Hello </div>
)
}
}
export default withStyles(styles)(App)
function styles() /*: do not put a return type here */ {
return createStyles({
// assume I need to use global styles, my actual project is more
// complex and for some reasons I need to use global styles
'@global': {
'.some-class': {
overflowX: 'hidden'
},
},
})
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2522 次 |
| 最近记录: |