source

Typescript는 무엇을 의미합니까?

manycodes 2023. 3. 22. 21:43
반응형

Typescript는 무엇을 의미합니까?

export declare function createEntityAdapter<T>(options?: {
    selectId?: IdSelector<T>;
    sortComparer?: false | Comparer<T>;
}): EntityAdapter<T>;

그뜻뜻 뭔뭔 가가 ?? ???는 알고 있다<> 인지 모르겠습니다.'T'이 기능이 어떤 역할을 하는지 누가 설명해 주면 도움이 될 것 같습니다.

좀 요?<T>수??

그건 타이프스크립트 제네릭 선언이야

발췌:

소프트웨어 엔지니어링의 주요 부분은 잘 정의되고 일관된 API를 가질 뿐만 아니라 재사용 가능한 구성 요소를 구축하는 것입니다.현재의 데이터뿐만 아니라 미래의 데이터에서도 작업할 수 있는 컴포넌트는 대규모 소프트웨어 시스템을 구축하기 위한 가장 유연한 기능을 제공합니다.

C#이나 Java와 같은 언어에서는 재사용 가능한 컴포넌트를 작성하기 위한 툴박스의 주요 도구 중 하나가 범용입니다.즉, 단일 컴포넌트가 아닌 다양한 타입에서 동작할 수 있는 컴포넌트를 작성할 수 있습니다.이를 통해 사용자는 이러한 구성 요소를 소비하고 고유한 유형을 사용할 수 있습니다.

말씀하신 내용:

난 'T'가 뭔지 몰라.

'T'컴파일 시간이 아닌 런타임에 선언된 유형이 됩니다.Tvariable은 선언되지 않은 임의의 변수일 수 있습니다(참조를 찾을 수 없지만 변수 이름에 사용할 수 있는 유효한 문자 집합을 가정합니다).마찬가지로 c에서도 다음과 같이 입력합니다.T값 보다 입니다.따라서 또는 수 .TVehicle ★★★★★★★★★★★★★★★★★」TAnimal는 미래의 베스트 할 수도 ).T직관적이지 않습니다).는 는는더 prefer prefer iTSomething대문자 T는 범용 타입을 의미하기 때문입니다. WSometing ★★★★★★★★★★★★★★★★★」ASomething(예를 들어 Microsoft API는 거의 항상 TContextTEntity입니다)도 유효하지만, 저는 별로 좋아하지 않습니다.

이 기능이 어떤 기능을 하는지 설명해 주시면 감사하겠습니다.

이 기능은 아무 것도 하지 않습니다.이는 여러 런타임 유형 값을 가질 수 있는 함수 유형을 선언하는 것입니다.그것을 설명하는 대신, 위 링크에서 직접 발췌한 내용을 첨부합니다.

function identity<T>(arg: T): T {
  return arg;
}

다음과 같이 사용할 수 있습니다.

// type of output will be 'string'
let output = identity<string>("myString");  

또는

// type of output will be 'string', the compiler will figure out `T`
// based on the value passed in
let output = identity("myString");  

또는

// type of output will be 'number'
let output = identity(8675309);  

그 때문에 의문이 생길 수 있다.

제네릭스를 사용하는 이유

배열이 모든 될 수 스크립트: Javascript).any). 타이프스크립트에서는 다음과 같이 선언함으로써 Type safety를 얻을 수 있습니다.

 // Array<T>
 let list: number[] = [1, 2, 3];
 // or 
 let list: Array<number> = [1, 2, 3];

어레이의 각 값에는 유형이 있습니다.이 배열에 문자열을 넣으려고 하면 Typescript에서 컴파일 시간 오류가 발생합니다.또한 값을 검색하면 (에디터에 따라) type-safety 및 intellisense가 표시됩니다.

class Person {
  FirstName: string;
}

let people: Array<Person> = [];
people.push({ FirstName: "John" } as Person);

let john = people.pop();  
// john is of type Person, the typescript compiler knows this
// because we've declared the people variable as an array of Person

console.log(john.FirstName);  

type'd 일반 제약 조건을 선언합니다.열린 - 닫힌 원리의 매우 좋은 예입니다.

객체 지향 프로그래밍에서 오픈/클로즈 원칙은 "소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장을 위해 개방되어야 하지만 수정을 위해 폐쇄되어야 한다"고 명시한다. 즉, 그러한 엔티티는 소스 코드를 수정하지 않고 동작을 확장할 수 있다.

다음 예에서는 누구나 Human 또는 Cheetah를 확장하거나 자체 파생 유형을 만들 수 있으며 Logger 기능은 수정 없이 계속 작동합니다.

interface IAnimal {
  LegCount: number;
}

class Cheetah 
  implements IAnimal {
  LegCount: number = 4;
}

class Human
  implements IAnimal {
  LegCount: number = 2;
}

public class Logger<TAnimal extends IAnimal> {
  public Log(animal: TAnimal) {
    console.log(animal.LegCount);
  }
}
 
var logger = new Logger();
var human = new Human();
logger.Log(human);      

작업 예제

이전 예에서 제한하기 위해 일반 제약 조건을 사용했습니다.TAnimal유형 프로그래머들은 만들 수 있습니다.Logger인터페이스에서 도출되는 인스턴스IAnimal. 이것은 컴파일러가 있는지 확인합니다.Logger클래스는 항상 속성을 가지고 있다고 가정한다.LegCount.

왜 그들이 <Type 문서에서는 어떻게 설명할지 설명하실 수 있습니다.T>와 같은 자세한 내용은 <예를 들어 ID> 예를 들어보세요.아무 것도 없고T> 날 위해서.이제 모든 사람들은 <T> 바보 같은 짓을 한 거야?

이것들은 다음과 같이 가정할 것이다.나는 서류형 시스템을 설계한 팀이나 문서를 작성한 팀도 모른다.

세대의 루트 레벨에서 사용할 수 있는 능력입니다.T가능한 유형(type)로 혼동되지 않음any)의 의미Array<T>우리가 대체하는 인터페이스(예: 더 나은 단어)를 만들 때T선언된 유형:

Array<number>

인터페이스에서는 Array<T>보다 더 말이 되는 것은T나도 몰라.난 그걸 알아.TType(숫자, 문자열 등)이어야 합니다.그러면,T왜냐하면 Type이라는 단어의 첫 글자이기 때문입니다.생각합니다Array<Type>타입 또는 타입이 예약 또는 제한되었을 경우(현재는) 매우 혼란스럽거나 무효가 될 수 있습니다.type특정 문맥에서는 특별한 의미가 있기 때문에 부적절한 선택이기도 합니다.따라서 그것들을 피하는 것이 좋습니다.다른 언어(C-Sharp, Java)도 사용하는 것을 선택합니다.T그래서 언어를 바꿔서 같은 용어를 사용할 수 있는 것이 유리합니다.

반대로, 다음의 의미는 무엇입니까?

Array<Identity>

죠?Identity의 개발자가알 수 있도록 .특정 타입의 어레이를 명시적으로 실장할 필요가 있다고 생각됩니다.즉, 범용 타입을 선택하는 것은 저에게 달려 있지 않습니다.

interface Foo1 {
  bars: Array<Identity>;
}

위의 예에서는 Identity가 기존 유형이며 변경할 수 없다고 가정합니다.

interface Foo2<T> {
  bars: Array<T>;
}

★★★★★★★★★★★★★★★★ Foo2나도 내가 타입을 선택해야 한다는 걸 알아.

interface Foo3<Identity> {
  bars: Array<Identity>;
}

Foo3혼란스러울 뿐이야

interface Foo4<TIdentity> {
  bars: Array<TIdentity>;
}

, 그럼 이제 ㅇㅇㅇㅇㅇㅇ로.Foo4저는 유형을 해야 한다는 더 , 왜 그런지는 아직 잘 TIdentity확실히, 타입이 정의되어 있는 상황에서는 의미가 있습니다.

편집: 2021년 3월 현재, Typescript Documentation은 다음 문서의 사용을 폐지하기 위해 갱신되었습니다.<T>''가 '''가 유리하다''로 되어 .<Type>.

그런 상황이라면, 는 개인적으로 다음 사항을 혼란스럽게 생각합니다.Type두 가지 이유가 있습니다.

interface Lengthwise {
  length: number;
}

function loggingIdentity<Type extends Lengthwise>(arg: Type): Type {
  console.log(arg.length); 
  return arg;
}

의 을 붙이지 첫 Type제약조건을 사용할 때는 방법 내에서 또는 여러 방법에서 잘 읽히지 않습니다.은 '벌목하다'라는입니다. 이치Type★★★★★★ 。

interface Lengthwise {
  length: number;
}

interface Widthwise {
  width: number;
}

function loggingLength<Type extends Lengthwise>(arg: Type): Type {
  console.log(arg.length);
  return arg;
}

function loggingWidth<Type extends Widthwise >(arg: Type): Type {
  console.log(arg.width);
  return arg;
}

저는 다음 내용이 훨씬 더 읽기 쉽다고 생각합니다.

interface Lengthwise {
  length: number;
}

interface Widthwise {
  width: number;
}

function loggingLength<TLengthwise extends Lengthwise>(arg: TLengthwise): TLengthwise {
  console.log(arg.length);
  return arg;
}

function loggingWidth<TWidthwise extends Lengthwise>(arg: TWidthwise ): TWidthwise {
  console.log(arg.length);
  return arg;
}

둘째, 여러 개의 범용이 있을 가능성이 매우 높기 때문에 다음 항목이 무효가 될 수 있습니다(명확한 이유로 인해).

interface Lengthwise {
  length: number;
}

interface Widthwise {
  width: number;
}

function loggingLength<Type extends Lengthwise, Type extends Widthwise>
(arg1: Type, arg2: Type) {
  console.log(arg1.length);
  console.log(arg2.width);
}

에서는 " " " 를 사용하고 .Type단순하고 평범한 예를 보여주기 위해, 저는 그 예시를 사용하지 말 것을 강력히 권장합니다.Type어떤 현실세계의 코드에서도요

되어 2021년 3월 3일 하고 있습니다.<T>''가 '''가 유리하다''로 되어 .<Type>링크

이 예는 범용 파라미터를 가진 함수입니다. T는 없습니다).T라고 할 수 G는, 의 을 범용 .T을 사용하다

Imagine EntityAdapter에는 다음과 같은 구현이 있습니다.

interface EntityAdapter<T> {
   save(entity: T);
}

는 EntityAdapter의 이 "EntityAdapter"인 합니다.anyanyanything.number, string, object anything.

let adapter1 = createEntityAdapter<any>(<parameters here>)

는 EntityAdapter의 이 "EntityAdapter"인 합니다.Car.

let adapter2 = createEntityAdapter<Car>(<parameters here>)

으로는 ★★★★★★★★★★★★★★.Car any이치럼럼이 게떻 ?떻 ?? ???

간단히 말해 일반 템플릿을 사용하면 추가적인 유형 안전성을 얻을 수 있습니다.예를들면,

adapter1.save('I am string') // this works because `T` is `any`
adapter1.save(new Car()) // this also works because `T` is `any`

adapter2.save('I am string') // this wont works  because `T` is `Car`, typescript compiler will complains
adapter2.save(new Car()) //this works because `T` is `Car`

이게 도움이 됐으면 좋겠다.

Generics라고 불리며, 안전하고 유연한 기능을 쓸 수 있도록 도와줍니다.유형에 변수를 제공합니다.즉, 앞에 유형을 지정하지 않고 서로 다른 유형으로 작동하는 함수, 인터페이스 또는 클래스를 만들 수 있습니다.사용 이유와 사용 방법을 설명하는 데모 코드 아래에 나와 있습니다.

// any is too general ,and it loses the meaning of using typescript

function insertAtBegining(array:any[],value:any) {
    let newArr = [value, ...array];
    return newArr;
}

// if we specify the type number , this function will lost it's utility 

function insertAtBegining(array:number[],value:number) {
    let newArr = [value, ...array];
    return newArr;
}

// if we specify the type string , this function will lost it's utility 

function insertAtBegining(array:string[],value:string) {
    let newArr = [value, ...array];
    return newArr;
}

const demoArr = [1, 2, 3];

const updatedArr = insertAtBegining(demoArr, 4);
// more generic functions

function insertAtBegining<T>(array:T[],value:T) {
    let newArr = [value, ...array];
    return newArr;
}

언급URL : https://stackoverflow.com/questions/49622045/in-typescript-what-does-t-mean

반응형