Skip to content

Commit

Permalink
Merge pull request #858 from mikinovation/docs/add-no-infer-to-utilit…
Browse files Browse the repository at this point in the history
…y-type

NoInferのドキュメントを追加
  • Loading branch information
suin committed May 3, 2024
2 parents 56bac13 + 93e0896 commit aa22efe
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 7 deletions.
2 changes: 1 addition & 1 deletion docs/reference/type-reuse/mapped-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type Butterfly = {
[key in SystemSupportLanguage]: string;
};
// ---cut---
// @errors: 2322
// @errors: 2353
const butterflies: Butterfly = {
en: "Butterfly",
fr: "Papillon",
Expand Down
48 changes: 48 additions & 0 deletions docs/reference/type-reuse/utility-types/no-infer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
description: 型推論を防ぐ
title: NoInfer<T>
---

`NoInfer<T>`は、`T`の型推論を防ぐためのユーティリティ型です。

## NoInfer&lt;T>の型引数

### T

型引数`T`には推論を防ぎたい型を代入します。

## NoInferの使用例

まずはNoInferを使用しなかった場合の例です。ジェネリクスを使って`getIndexFromArray`という関数を定義します

```ts
function getIndexFromArray<T extends string>(elements: T[], item: T): number {
return elements.findIndex((element) => element === item);
}

type Fruit = "grape" | "apple" | "banana";
const fruits: Fruit[] = ["grape", "apple", "banana"];
getIndexFromArray(fruits, "apple");
getIndexFromArray(fruits, "peach");
```

このとき`T``"grape" | "apple" | "banana" | "peach"`と推論されてしまいます。しかし第二引数には配列に含まれている要素のみを許容したいです。そこで`NoInfer`を利用することにより`T`の型推論を防ぐことができます。

```ts twoslash
function getIndexFromArray<T extends string>(
elements: T[],
item: NoInfer<T>
): number {
return elements.findIndex((element) => element === item);
}

type Fruit = "grape" | "apple" | "banana";
const fruits: Fruit[] = ["grape", "apple", "banana"];
getIndexFromArray(fruits, "apple");
// @errors: 2345
getIndexFromArray(fruits, "peach");
```

## 関連情報

[Infer](../../values-types-variables/type-inference.md)
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ TypeScriptのオブジェクトの型には余剰プロパティチェック(exc
たとえば、`{ x: number }`はプロパティ`x`が必須なオブジェクトの型です。この型に`{ x: 1, y: 2 }`のような値を代入しようとします。この代入は許可されるでしょうか。代入値の型は、必須プロパティの`{ x: number }`を満たしているので問題なさそうです。ところが、この代入は許可されません。

```ts twoslash
// @errors: 2322
// @errors: 2353
let onlyX: { x: number };
onlyX = { x: 1 }; // OK
onlyX = { x: 1, y: 2 }; // コンパイルエラー
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
"react-dom": "^17.0.2",
"react-nl2br": "^1.0.4",
"remark-breaks": "^2.0.2",
"typescript": "5.2.2",
"typescript": "5.4.3",
"url-loader": "^4.1.1"
},
"devDependencies": {
Expand Down
1 change: 1 addition & 0 deletions sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ module.exports = {
"reference/type-reuse/utility-types/omit",
"reference/type-reuse/utility-types/exclude",
"reference/type-reuse/utility-types/extract",
"reference/type-reuse/utility-types/no-infer",
],
},
"reference/type-reuse/mapped-types",
Expand Down
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -9896,10 +9896,10 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"

typescript@5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
typescript@5.4.3:
version "5.4.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff"
integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==

typescript@>3:
version "5.1.6"
Expand Down

0 comments on commit aa22efe

Please sign in to comment.