`extends`キーワードを用いることで、[[型パラメーター (TypeScript)|型パラメーター]]に[[プロパティ (TypeScript)|プロパティ]]などの制約を課すること。 ```ts // nameプロパティをもつ という制約を Tに課している function printName<T extends { name: string }>(target: T) { console.log(target.name) // ^? (property) name: string } printName({ name: "hoge" }) // "hoge" printName("hoge") // Argument of type 'string' is not assignable to parameter of type '{ name: string; }'.(2345) ``` <button class="playground"><a href="https://www.typescriptlang.org/play?#code/PTAEDsEMFsFNHWGQtwyEWGQYwyGKGQSQyCCGQJgykAsGQEQZAxBkDYlQEF9NQAVQawZAmqMHUGQMwYjBohgCgAzAV3ADGAFwCWAe3CgADgCcR4IQDkYsADw1QsAB5DY4ACYBnUAG8IKgFyhDQueADmoAL4A+ABRDIM+7CFWaAJSmnKChoAIShmIANrAAdNFi9h5ePkJxUHABIWEgYfkFhQB6APycTpycsvJKKm5mmbBWAEQAFkmwzc5BeW0dzVV2tXBufT7NPWAAgt68cAqgYtygQgCeUrCgAOQ2dvZboCLG4GJCoJCGhiL2UABGsSti0l4qujKLy2sb2w2W1rbyewAbmcWzibgATABmAAsAFZskA">Playground</a></button> `extends`という言葉が直感的でない場合 `T extends U` を 『TはUに代入可能』とも言い換えられる。 ```ts interface HasLength { length: number; } // T extends HasLength は 『TはHasLengthに代入可能』とも言い換えられる // T extends U は 『TはUに代入可能』とも言い換えられる function getLength<T extends HasLength>(arg: T): number { return arg.length; } declare const a: HasLength; const b: any[] = a; // Arrayのプロパティが不足しているため代入不可能 declare const c: any[]; const d: HasLength = c; // lengthプロパティさえあればいいので代入可能 ``` <button class="playground"><a href="https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgBJwM4BkIgOZgAWyA3gFDLIA2uBhAXMiAK4C2ARtANxkC+ZZAPSDkAFWQQAHpBAATDGkw58RZIHsGZIDgGUWvTZaRQNYMgY7lApoqB75UC-AYHgGQBYMgIIZAAFGARBkDbxoAkGQJEMgGIZA0QxCRcSkZeWQAVXUtHTCTCxsHFw8ffxhmEAQwYAB7EGQ8CDBlOgAeIOlcUL0iogA+AAo4KDxGUQBKRhYOaFIKZCgC5ihcxrwAOhoVQh5+MlkIBCpGlAQcjDBkOEYqgymyFZA15HZGOBAATwBtAF1kAF4NrmRhZABBKCg4M8A7BkB1hkBbhkAiwyAMYZAMUMgBkGQCwcoBm2MA6gyAMwZnL5APoMgECGMwQqwCOYLJbIfaHBAnc7XHj49ayLZKHZ3PGPZ4TOj-YEgwCqDO5AEIM3kADgzOZxfQDmDGZMUA">Playground</a></button> たとえば `T extends string` の`T`は[[文字列リテラル型 (TypeScript)|文字列リテラル型]]などが当てはまるが、以下を満たすので『[[文字列リテラル型 (TypeScript)|文字列リテラル型]]はstring型に代入可能』と言える。 ```ts const str: string = "hoge"; ```