typescript - ジェネリックスとジェネリック制約

汎用<T>


場合によっては、関数のパラメーターの型が不確実ですが、パラメーターの型が一貫している必要があるか、パラメーターの型と戻り値の型が一貫している必要があります。汎用の汎用形式を使用できます -- 型を 1 組のアングルに入れることができます角かっこ (例: <T >)。その中のキーワードはオプションで、U、K、V などがすべて使用可能で、T は通常、タイプ (タイプ) を表すために使用されます。

これを使用する場合、受信ジェネリック型を記述する必要はありません。最初に受信する値の型に応じてジェネリック型を自動的に推測でき、後で同じジェネリック型を使用できます。この型に限定されます。

サンプルコード:

// 数组重载
function test1(a:number, b:number):Array<number> {
    
    
  return [a, b]
}

function test2(a:string, b:string):Array<string> {
    
    
  return [a, b]
}

// 可以使用泛型,简写
function test3<T>(a:T, b:T):Array<T> {
    
    
  return [a, b]
}

function test4<T,K>(a:T, b:K):Array<T | K> {
    
    
  return [a, b]
}

console.log(test3(1, 2));
console.log(test3('1', '2'));
console.log(test3(true,false));

console.log(test4(true,1));

印刷結果:

ここに画像の説明を挿入

ここに画像の説明を挿入

一般的な制約: extends、keyof

場合によっては、ジェネリック型に型制約を追加する必要があります。制限は特定の型の範囲内です。そうでない場合は、型に ** 操作 (拡張) がないというエラーが報告される場合があります。また、オブジェクトの属性値を取得するときに
、 key は操作対象のオブジェクトのキー名に制約できます (extends + keyof)

サンプルコード:

function add<T extends number>(a:T, b:T) {
    
    
  return a + b
}
console.log(add(1, 2));


interface len {
    
    
  length: number
}

function test<T extends len>(a:T) {
    
    
  return a.length
}

console.log(test('花花'));
console.log(test(['花花', '何叶']));


function fn<T extends object, K extends keyof T>(a:T, b:K) {
    
    
  return a[b]
}

let obj = {
    
    
  name: '史迪仔',
  age: 100
}
console.log(fn(obj, 'name'));


// 将属性设置为可选
interface Data {
    
    
  name: string,
  age: number,
  sex: string
}

type Options<T extends object> = {
    
    
  [Key in keyof T]?:T[Key]
}

type B = Options<Data>

ここに画像の説明を挿入
印刷結果:

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_39111074/article/details/132143375