web-dev-qa-db-ja.com

ジェネリック型のconstの宣言

ボイラープレートを減らすために、ある種の汎用関数インターフェイスを型として宣言しています。次に、そのようなタイプのconstを宣言したいと思います。では、TypeScriptがfoo宣言を正当であると見なし、barを正当ではないと見なす理由は何でしょうか。これらの宣言は実質的に同一ではありませんか? TypeScriptには単純な機能が不足していますか、それとも詳細が不足していますか? FunctionTypeインターフェイスを明示的に繰り返したくない場合、回避策はありますか?

type FunctionType<TValue> = (value: TValue) => void;

const foo = <TValue>(value: TValue): void => {
}

//const bar: FunctionType<TValue> = (value) => { // Cannot find name 'TValue'
//}
12
idementia

関数であるジェネリック型とジェネリック関数である型には違いがあります。

そこで定義したのは、関数であるジェネリック型です。これは、ジェネリック型が指定されているconstにこれを割り当てることができることを意味します。

type FunctionType<TValue> = (value: TValue) => void;
const bar: FunctionType<number> = (value) => { // value is number
}

ジェネリック関数である型を定義するには、引数リストの前に型パラメーターを置く必要があります

type FunctionType = <TValue>(value: TValue) => void;
const bar: FunctionType = <TValue>(value) => { // generic function
}