`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";
```