doc: update typescript.

This commit is contained in:
jaywcjlove 2022-09-28 11:02:07 +08:00
parent 64536d8024
commit 5234cdc024

View File

@ -16,10 +16,11 @@ TypeScript 是具有类型语法的 JavaScript。Interface 是为了匹配它们
### 内置类型基元 ### 内置类型基元
```ts ```ts
any, void,
boolean, string, number, boolean, string, number,
undefined, null, undefined, null,
any, unknown, never, unknown, never,
void, bigint, symbol bigint, symbol
``` ```
### 常见的内置 JS 对象 ### 常见的内置 JS 对象
@ -388,7 +389,7 @@ const data1 = {
// } // }
``` ```
使用 `as const` 缩小类型 👇 使用 `as const` 缩小类型 👇
```ts ```ts
const data2 = { const data2 = {
@ -485,6 +486,27 @@ assertResponse(res)
res // SuccessResponse res // SuccessResponse
``` ```
### in 操作符
```ts
interface A {
x: number;
}
interface B {
y: string;
}
function doStuff(q: A | B) {
if ('x' in q) {
// q: A
} else {
// q: B
}
}
```
操作符可以安全的检查一个对象上是否存在一个属性,它通常也被作为类型保护使用
Class Class
---- ----
@ -1080,7 +1102,7 @@ JSX 规范是对 ECMAScript 的类似 XML 的语法扩展。
```ts ```ts
const foo = <foo>bar; const foo = <foo>bar;
// 不允许在 .tsx 👆 文件中使用尖括号类型断言。 // 不允许在 .tsx 👆 文件中使用尖括号类型断言。
const foo = bar as foo; const foo = bar as foo;
``` ```
@ -1157,9 +1179,9 @@ interface SideProps extends CeProps {
side: JSX.Element | string; side: JSX.Element | string;
} }
function Dog(prop: HomeProps): JSX.Element; function Dog(prop:HomeProps): JSX.Element;
function Dog(prop: SideProps): JSX.Element; function Dog(prop:SideProps): JSX.Element;
function Dog(prop: CeProps): JSX.Element { function Dog(prop:CeProps): JSX.Element {
// ... // ...
} }
``` ```
@ -1184,34 +1206,14 @@ const Menu: MenuComponent = React.forwardRef<HTMLUListElement>(
Menu.Item = MenuItem; Menu.Item = MenuItem;
Menu.SubMenu = SubMenu; Menu.SubMenu = SubMenu;
<Menu.Item /> // ok <Menu.Item /> // ok
<Menu.SubMenu /> // ok <Menu.SubMenu /> // ok
``` ```
### 类组件 ### 有效组件
<!--rehype:warp-class=row-span-2-->
```ts
class MyComponent {
render() {}
}
// 使用构造签名
const myComponent = new MyComponent();
// element class type => MyComponent
// element instance type => { render: () => void }
function MyFactoryFunction() {
return {
render: () => {},
};
}
// 使用调用签名
const myComponent = MyFactoryFunction();
// element class type => MyFactoryFunction
// element instance type => { render: () => void }
```
元素实例类型很有趣因为它必须可以分配给JSX。ElementClass否则将导致错误。默认情况下JSX。ElementClass 是 {}但可以对其进行扩展以将JSX的使用限制为仅限于符合适当接口的类型。
<!--rehype:-->
```tsx ```tsx
declare namespace JSX { declare namespace JSX {
interface ElementClass { interface ElementClass {
@ -1224,9 +1226,13 @@ class MyComponent {
function MyFactoryFunction() { function MyFactoryFunction() {
return { render: () => {} }; return { render: () => {} };
} }
<MyComponent />; // ok <MyComponent />; // ✅ 有效类组件
<MyFactoryFunction />; // ok <MyFactoryFunction />; // ✅ 有效函数组件
```
元素实例类型必须可以分配给 `JSX.ElementClass`,否则将导致错误。
```tsx
class NotAValidComponent {} class NotAValidComponent {}
function NotAValidFactoryFunction() { function NotAValidFactoryFunction() {
return {}; return {};
@ -1235,3 +1241,40 @@ function NotAValidFactoryFunction() {
<NotAValidFactoryFunction />; // ❌ error <NotAValidFactoryFunction />; // ❌ error
``` ```
默认情况下,`JSX.ElementClass` 是 {},但可以对其进行扩展,以将 `JSX` 的使用限制为仅限于符合适当接口的类型。
### 类组件
<!--rehype:warp-class=col-span-2-->
<!--rehype:-->
```ts
type Props = {
header: React.ReactNode;
body: React.ReactNode;
};
class MyComponent extends React.Component<Props, {}> {
render() {
return (
<div>
{this.props.header}
{this.props.body}
</div>
);
}
}
<MyComponent header={<h1>Header</h1>} body={<i>body</i>} />
```
### 泛型组件
```tsx
// 一个泛型组件
type SelectProps<T> = { items: T[] };
class Select<T> extends React.Component<SelectProps<T>, any> {}
// 使用
const Form = () => <Select<string> items={['a', 'b']} />;
```