Typescript는 무엇을 의미합니까?
export declare function createEntityAdapter<T>(options?: {
selectId?: IdSelector<T>;
sortComparer?: false | Comparer<T>;
}): EntityAdapter<T>;
그뜻뜻 뭔뭔 가가 ?? ???는 알고 있다<>
인지 모르겠습니다.'T'
이 기능이 어떤 역할을 하는지 누가 설명해 주면 도움이 될 것 같습니다.
좀 요?
<T>
수??
그건 타이프스크립트 제네릭 선언이야
발췌:
소프트웨어 엔지니어링의 주요 부분은 잘 정의되고 일관된 API를 가질 뿐만 아니라 재사용 가능한 구성 요소를 구축하는 것입니다.현재의 데이터뿐만 아니라 미래의 데이터에서도 작업할 수 있는 컴포넌트는 대규모 소프트웨어 시스템을 구축하기 위한 가장 유연한 기능을 제공합니다.
C#이나 Java와 같은 언어에서는 재사용 가능한 컴포넌트를 작성하기 위한 툴박스의 주요 도구 중 하나가 범용입니다.즉, 단일 컴포넌트가 아닌 다양한 타입에서 동작할 수 있는 컴포넌트를 작성할 수 있습니다.이를 통해 사용자는 이러한 구성 요소를 소비하고 고유한 유형을 사용할 수 있습니다.
말씀하신 내용:
난 'T'가 뭔지 몰라.
'T'
컴파일 시간이 아닌 런타임에 선언된 유형이 됩니다.그T
variable은 선언되지 않은 임의의 변수일 수 있습니다(참조를 찾을 수 없지만 변수 이름에 사용할 수 있는 유효한 문자 집합을 가정합니다).마찬가지로 c#에서도 다음과 같이 입력합니다.T
값 보다 입니다.따라서 또는 수 .TVehicle
★★★★★★★★★★★★★★★★★」TAnimal
는 미래의 베스트 할 수도 ).T
직관적이지 않습니다).는 는는더 prefer prefer iTSomething
대문자 T는 범용 타입을 의미하기 때문입니다. WSometing
★★★★★★★★★★★★★★★★★」ASomething
(예를 들어 Microsoft API는 거의 항상 TContext나 TEntity입니다)도 유효하지만, 저는 별로 좋아하지 않습니다.
이 기능이 어떤 기능을 하는지 설명해 주시면 감사하겠습니다.
이 기능은 아무 것도 하지 않습니다.이는 여러 런타임 유형 값을 가질 수 있는 함수 유형을 선언하는 것입니다.그것을 설명하는 대신, 위 링크에서 직접 발췌한 내용을 첨부합니다.
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
나도 몰라.난 그걸 알아.T
Type(숫자, 문자열 등)이어야 합니다.그러면,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"인 합니다.any
any
anything.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
'source' 카테고리의 다른 글
{% 확장 '... %} 조건부로 만들 수 있는 방법이 있습니까? - 장고 (0) | 2023.03.27 |
---|---|
React.js는 체크박스 상태를 변경할 수 없습니다. (0) | 2023.03.22 |
스타일링 리액트 네이티브 피커 (0) | 2023.03.22 |
json 파일을 mongo로 Import하는 올바른 방법 (0) | 2023.03.22 |
클래스 이름을 JSON Jackson 일련화의 루트 키로 사용 (0) | 2023.03.22 |