エリックではなく、ジェニーンリックです.
1. Generics
実際、C#、Javaなどの言語で再利用可能なコンポーネントを作成する際にJENICがよく使われていると初めて聞きました.1つ以上のタイプで動作する構成部品を作成します.
2.基本形態 function logContent<T>(content: T): T{
console.log(content);
return content;
}
logContent('soryeongk');
呼び出し時に宣言時にタイプを決定しないことを許可します.T
は、タイプを表すために書かれている.いずれにしても、この名前はいいです.:)// T를 굳이 안써도 됨
function logContent<soryeongk>(content: soryeongk): soryeongk {
console.log(content);
return content;
}
どうして書きますか。
上記の例に示すように、入力したデータを返す関数があるとします.stringを入力するとstringを返さなければなりません.numberを入力するとnumberを返さなければなりません.
簡単に言えば、以下のように書くことができます.function logString<string>(content: string): string{
console.log(content);
return content;
}
function logNumber<number>(content: number): number{
console.log(content);
return content;
}
2つの関数は非常に似ています.jsでなければ、名前の異なる関数にすぎません.同じ機能を持つ関数タイプのために2回定義するのは、誰から見ても非効率です.
呼び出しポイントでタイプのJENICを定義することで、関数の重複問題を解決できます.
3-1. EungUnionは使えませんか?
もちろんいいですよ.パッと見る
送信するデータはstringまたはnumberでなければならないとします.下図に示すように、パラメータのタイプはstringまたはnumberのみです.function logContent(content: string | number) {
console.log(content);
return content;
}
logContent('soryeongk');
logContent(25);
3-2. どうしてジェニーンリックを必要としたの?
今のような簡単な仕事をしないで、もう一つ追加します.function logContent(content: string | number) {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(typeof name); // 결과는?
name.length // 결과는?
正解
console.logにはstring
name.length
があります.
どうしたんですか.
nameはerror
と明確に認識されているが、string
によって提供されるstring
は使用できない.これはlength
の因子タイプがlogContent
であるため,本タイプにはstring | number
はないと考えられる.
3-3. ジェニーンリックでユニオンの代わりに
function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(name.length) // 결과는?
正解
まだエラーが発生します.パラメータ文字列のprototypeを使用するには、JENICを使用してもパラメータのタイプを指定する必要があります.以下のように使用できます. function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent<string>('soryeongk');
console.log(name.length) // 9
4.再利用!
私の所属する学習グループのメンバーの情報を保存したいです.
学習園は霊、正、言、秀、姫、含です.齢児、正児、彦児、秀児は97年生まれ、熙児は98年生まれ、含児は98年近く生まれた.interface SparTaS {
name: string;
born: number;
isAbsent: boolean;
}
const ryeongE: SparTaS = { name: '령이', born: 97, isAbsent: false };
const jeongE: SparTaS = { name: '졍이', born: 97, isAbsent: false };
const eonE: SparTaS = { name: '언이', born: 97, isAbsent: false };
const heeYa: SparTaS = { name: '희야', born: 98, isAbsent: false };
// born: "빠른 98"
const suYa: SparTaS = { name: '수야', born: 97, isAbsent: true };
私は「含伊」と入力します.問題は年齢です.含伊は25歳ですが、実は虎です.だから私は塩を入力したいのはlength
で、残りはnumberを入力して、stringを加えることができません.
4-1. 何とかしよう!
次の方法で使用できます.
function logContent<T>(content: T): T{
console.log(content);
return content;
}
logContent('soryeongk');
呼び出し時に宣言時にタイプを決定しないことを許可します.T
は、タイプを表すために書かれている.いずれにしても、この名前はいいです.:)// T를 굳이 안써도 됨
function logContent<soryeongk>(content: soryeongk): soryeongk {
console.log(content);
return content;
}
どうして書きますか。
上記の例に示すように、入力したデータを返す関数があるとします.stringを入力するとstringを返さなければなりません.numberを入力するとnumberを返さなければなりません.
簡単に言えば、以下のように書くことができます.function logString<string>(content: string): string{
console.log(content);
return content;
}
function logNumber<number>(content: number): number{
console.log(content);
return content;
}
2つの関数は非常に似ています.jsでなければ、名前の異なる関数にすぎません.同じ機能を持つ関数タイプのために2回定義するのは、誰から見ても非効率です.
呼び出しポイントでタイプのJENICを定義することで、関数の重複問題を解決できます.
3-1. EungUnionは使えませんか?
もちろんいいですよ.パッと見る
送信するデータはstringまたはnumberでなければならないとします.下図に示すように、パラメータのタイプはstringまたはnumberのみです.function logContent(content: string | number) {
console.log(content);
return content;
}
logContent('soryeongk');
logContent(25);
3-2. どうしてジェニーンリックを必要としたの?
今のような簡単な仕事をしないで、もう一つ追加します.function logContent(content: string | number) {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(typeof name); // 결과는?
name.length // 결과는?
正解
console.logにはstring
name.length
があります.
どうしたんですか.
nameはerror
と明確に認識されているが、string
によって提供されるstring
は使用できない.これはlength
の因子タイプがlogContent
であるため,本タイプにはstring | number
はないと考えられる.
3-3. ジェニーンリックでユニオンの代わりに
function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(name.length) // 결과는?
正解
まだエラーが発生します.パラメータ文字列のprototypeを使用するには、JENICを使用してもパラメータのタイプを指定する必要があります.以下のように使用できます. function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent<string>('soryeongk');
console.log(name.length) // 9
4.再利用!
私の所属する学習グループのメンバーの情報を保存したいです.
学習園は霊、正、言、秀、姫、含です.齢児、正児、彦児、秀児は97年生まれ、熙児は98年生まれ、含児は98年近く生まれた.interface SparTaS {
name: string;
born: number;
isAbsent: boolean;
}
const ryeongE: SparTaS = { name: '령이', born: 97, isAbsent: false };
const jeongE: SparTaS = { name: '졍이', born: 97, isAbsent: false };
const eonE: SparTaS = { name: '언이', born: 97, isAbsent: false };
const heeYa: SparTaS = { name: '희야', born: 98, isAbsent: false };
// born: "빠른 98"
const suYa: SparTaS = { name: '수야', born: 97, isAbsent: true };
私は「含伊」と入力します.問題は年齢です.含伊は25歳ですが、実は虎です.だから私は塩を入力したいのはlength
で、残りはnumberを入力して、stringを加えることができません.
4-1. 何とかしよう!
次の方法で使用できます.
function logString<string>(content: string): string{
console.log(content);
return content;
}
function logNumber<number>(content: number): number{
console.log(content);
return content;
}
function logContent(content: string | number) {
console.log(content);
return content;
}
logContent('soryeongk');
logContent(25);
function logContent(content: string | number) {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(typeof name); // 결과는?
name.length // 결과는?
function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent('soryeongk');
console.log(name.length) // 결과는?
function logContent<T>(content: T): T {
console.log(content);
return content;
}
const name = logContent<string>('soryeongk');
console.log(name.length) // 9
私の所属する学習グループのメンバーの情報を保存したいです.
学習園は霊、正、言、秀、姫、含です.齢児、正児、彦児、秀児は97年生まれ、熙児は98年生まれ、含児は98年近く生まれた.
interface SparTaS {
name: string;
born: number;
isAbsent: boolean;
}
const ryeongE: SparTaS = { name: '령이', born: 97, isAbsent: false };
const jeongE: SparTaS = { name: '졍이', born: 97, isAbsent: false };
const eonE: SparTaS = { name: '언이', born: 97, isAbsent: false };
const heeYa: SparTaS = { name: '희야', born: 98, isAbsent: false };
// born: "빠른 98"
const suYa: SparTaS = { name: '수야', born: 97, isAbsent: true };
私は「含伊」と入力します.問題は年齢です.含伊は25歳ですが、実は虎です.だから私は塩を入力したいのはlength
で、残りはnumberを入力して、stringを加えることができません.4-1. 何とかしよう!
次の方法で使用できます.
3つ目は、上記のようにnumberタイプで提供されているプロトタイプを使用できず、あまりよく見えないかもしれません.
だから4つの方法で実現しましょう!
4-2. インタフェースにジェニーリックを追加
まずは漬物を添えてやっぱり間違えた…!
SparTasのbornのみJENERICで解決しましょうか?!
interface SparTaS<T> {
name: string;
born: T;
isAbsent: boolean;
}
const ryeongE: SparTaS<number> = { name: '령이', born: 97, isAbsent: false };
const jeongE: SparTaS<number> = { name: '졍이', born: 97, isAbsent: false };
const eonE: SparTaS<number> = { name: '언이', born: 97, isAbsent: false };
const heeYa: SparTaS<number> = { name: '희야', born: 97, isAbsent: false };
const suYa: SparTaS<number> = { name: '수야', born: 97, isAbsent: false };
const HamE: SparTaS<string> = { name: '함이', born: '빠른 98', isAbsent: false };
JENERICを使用しているので、新しいタイプの情報を適宜入れたり、後でnumberやstring自体の機能を使ったりすることができます!わあ!5.ジェニーンリックのタイプを制限する function logTextLength<T>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('hi');
logTextLengthを定義するとき、Tにはどのようなタイプが含まれるか分かりません.関数でtextのlengthを撮影しようとすると、エラーが発生します.
だからTの中にString Arrayなどがlengthをサポートするタイプがある場合があります.
5-1. まず方法を教えてあげます。
方法
function logTextLength<T extends string>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('hi');
方法
インタフェースの利用interface lengthType {
length: number;
}
function logTextLength<T extends lengthType>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('soryeongk');
textが渡すタイプにはnumberタイプを持つlengthというpropertyがあります.
5-2. super TypeとsubType、extendsは拡張か制限か
恥ずかしいことに、正しい名前が빠른 98
とsuperType
であることはまだ確定していない.スーパーなにサーブなに...知っている人はコメントを残しましょう!interface Person {
name: string;
age: number;
}
interface Developer {
name: string;
age: number;
isFE: boolean;
}
上記のコードは次のように記述できます.interface Person {
name: string;
age: number;
}
interface Developer extends Person {
isFE: boolean;
}
このうち,開発者はPersonのサブタイプである.Personは開発者のスーパータイプです.
Personには2種類の開発者しかいませんよね?!
でもPersonはSuperDeveloperはSub
より多くの制限を持つ友达はsubになります.
例を見てみましょうか。
次のコードに表示されるエラーはいくらですか?let person: Person;
let developer: Developer;
person = developer; // 1번
developer = person; // 2번
正解は2番:)理由がわからなければメッセージを!
5-3. キーの操作
keyofは、オブジェクトキーの文字値を取得します.interface Person {
name: string;
age: number;
}
type test = keyof Person; // ('name', 'age')
これをジェニーンリックの制限に使ってみました.interface Person {
name: string;
age: number;
}
function pluck<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
let person: Person = {
name: 'soryeongk',
age: 25
};
let myString: string = pluck(person, 'name');
let myNumber: number = pluck(person, 'age');
console.log(myString); // 결과는?
console.log(myNumber); // 결과는?
keyofで受信したキー値を限定するために!:)
2009年
Reference
この問題について(エリックではなく、ジェニーンリックです.), 我々は、より多くの情報をここで見つけました
https://velog.io/@soryeongk/genericsTS
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
function logTextLength<T>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('hi');
function logTextLength<T extends string>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('hi');
interface lengthType {
length: number;
}
function logTextLength<T extends lengthType>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('soryeongk');
interface Person {
name: string;
age: number;
}
interface Developer {
name: string;
age: number;
isFE: boolean;
}
interface Person {
name: string;
age: number;
}
interface Developer extends Person {
isFE: boolean;
}
let person: Person;
let developer: Developer;
person = developer; // 1번
developer = person; // 2번
interface Person {
name: string;
age: number;
}
type test = keyof Person; // ('name', 'age')
interface Person {
name: string;
age: number;
}
function pluck<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
let person: Person = {
name: 'soryeongk',
age: 25
};
let myString: string = pluck(person, 'name');
let myNumber: number = pluck(person, 'age');
console.log(myString); // 결과는?
console.log(myNumber); // 결과는?
Reference
この問題について(エリックではなく、ジェニーンリックです.), 我々は、より多くの情報をここで見つけました https://velog.io/@soryeongk/genericsTSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol