Typescript: 제안: typeof륌 사용하여 몚든 표현식의 유형을 가젞옵니닀.

에 만든 2016년 01월 25음  Â·  157윔멘튞  Â·  출처: microsoft/TypeScript

읎 제안에 대한 작업 구현

사용핎 볎Ʞ: npm install yortus-typescript-typeof

찚읎점 볎Ʞ: 여Ʞ .

묞제 시나늬였

TypeScript의 유형 추론은 대부분의 겜우륌 잘 닀룚고 있습니닀. 귞러나 컎파음러에서 유추할 수 있음에도 불구하고 익명 형식을 찞조하는 확싀한 방법읎 없는 몇 가지 상황읎 ë‚šì•„ 있습니닀. 몇 가지 예:

강력한 형식의 컬렉션읎 있지만 요소 형식읎 익명/알 수 없습니닀. 요소 형식을 찞조하렀멎 얎떻게 í•Žì•Œ 합니까? (#3749)
// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
function checkItem(item: typeof data[0] /* ERROR */) {...}

// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42, ... };
type Thing2Type = typeof things['thing-2']; // ERROR

// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0); // ERROR
핚수가 로컬/익명/접귌할 수 없는 유형을 반환합니닀. 읎 반환 유형을 얎떻게 ì°žì¡°í•  수 있습니까? (#4233, #6179, #6239)
// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
    class MyAPI {
        constructor(http) {...}
        foo() {...}
        bar() {...}
        static id = id;
    }
    return new MyAPI($http);
}
function augmentAPI(api: MyAPI /* ERROR */) {...}
복잡한 익명 몚양의 읞터페읎슀가 있습니닀. 속성 및 하위 속성의 유형을 얎떻게 ì°žì¡°í•  수 있습니까? (#4555, #4640)
// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    },

    // prop2 shares some structure with prop1
    prop2: typeof MyInterface.prop1.big.complex; // ERROR
}

익명/추론된 유형을 ì°žì¡°í•Žì•Œ 하는 읎유는 묎엇입니까?

한 가지 예는 익명 유형을 맀개변수로 사용하는 핚수륌 선얞하는 것입니닀. 맀개변수의 유형 죌석에서 얎떻게든 유형을 ì°žì¡°í•Žì•Œ 합니닀. 귞렇지 않윌멎 맀개변수륌 any 로 입력핎알 합니닀.

현재 í•Žê²° 방법

표현식을 평가 하지 않고 원하는 유형을 유추하는 읎니셜띌읎저륌 사용하여 더믞 변수륌 선얞합니닀(읎는 런타임 부작용을 원하지 않고 유형 유추만 하Ʞ 때묞에 쀑요합니닀). 예륌 듀얎:

let dummyReturnVal = null && someFunction(0, ''); // NB: someFunction is never called!
let ReturnType = typeof dummyReturnVal;           // Now we have a reference to the return type

읎 í•Žê²° 방법에는 몇 가지 닚점읎 있습니닀.

  • 맀우 명확하게 kludge, 독자에게 명확하지 않음
  • 식별자 였엌( dummyReturnValue 곌 같은 변수륌 도입핎알 핹)
  • 명령묞읎 필요하Ʞ 때묞에 죌변 컚텍슀튞에서는 작동하지 않습니닀.

제안 된 핎법

_(죌의: 읎 솔룚션은 #4233에서 읎믞 제안되었지만 핎당 묞제에는 '제안 필요'띌는 태귞가 지정되얎 있윌며 닀륞 몇 가지 밀접하게 ꎀ렚된 묞제가 있윌므로 읎 별도의 묞제입니닀.)_

typeof 의 플연산자가 임의의 표현식읎 되도록 허용합니닀. 읎것은 if (typeof foo() === 'string') 와 같은 값 위치의 typeof expr 에 대핮 읎믞 허용됩니닀. 귞러나 읎 제안은 typeof 가 type ElemType = typeof list[0] 와 같읎 유형 쿌늬로 유형 위치에서 사용될 때 임의의 표현식도 허용합니닀.

읎 제안은 읎믞 사양의 현재 묞구와 밀접하게 음치합니닀.

형식 쿌늬는 개첎 늬터럎, 핚수 ì„ ì–ž 및 넀임슀페읎슀 선얞곌 같은 닀양한 구성에 의핎 생성되는 익명 형식을 캡처하는 데 유용합니닀.

따띌서 읎 제안은 위의 예와 같읎 현재 제공되지 않는 상황에 ê·ž 유용성을 확장하는 것입니닀.

구묞 및 의믞

의믞 첎계는 읎믞 사양 4.18.6 에 명시된 것곌 동음합니닀.

'typeof' 연산자는 몚든 유형의 플연산자륌 사용하여 String Ʞ볞 유형의 값을 생성합니닀. 유형읎 예상되는 위치에서 유형 쿌늬(섹션 3.8.10)에서 'typeof'륌 사용하여 표현식 유형을 생성할 수도 있습니닀.

제안된 찚읎점은 아래 읞용된 섹션 3.8.10 곌 ꎀ렚읎 있윌며, 여Ʞ서 췚소선 텍슀튞는 제거되고 굵은 텍슀튞는 추가됩니닀.

유형 쿌늬는 typeof 킀워드 와 표현식윌로 구성됩니닀. 표현식은 식별자 표현식(섹션 4.3) 또는 속성 액섞슀 표현식(섹션 4.13)윌로 처늬되며, 읎 표현식 의 확장된 유형(섹션 3.12)읎 결곌가 됩니닀. 닀륞 정적 유형 지정 구묞곌 유사하게 유형 쿌늬는 생성된 JavaScript 윔드에서 지워지고 런타임 였버헀드가 추가되지 않습니닀.

ê°•ì¡°í•Žì•Œ 할 점(슀펙에도 있닀고 생각했지만 찟을 수 없음)은 유형 쿌늬가 플연산자륌 평가 하지 않는닀는 것 입니닀. 귞것은 현재 사싀읎며 더 복잡한 표현식에 대핎서도 마찬가지입니닀.

읎 제안은 새로욎 구묞을 도입하지 않고 쿌늬할 수 있는 표현식 유형에서 typeof 륌 덜 제한적윌로 만듭니닀.

예

// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
function checkItem(item: typeof data[0]) {...} // OK: item type is {raw:number, square:number}

// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42, ... };
type Thing2Type = typeof things['thing-2']; // OK: Thing2Type is number

// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0); // OK: ItemType is HTMLLIElement

// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
    class MyAPI {
        constructor(http) {...}
        foo() {...}
        bar() {...}
        static id = id;
    }
    return new MyAPI($http);
}
type MyAPI = typeof myAPIFactory(null, 0); // OK: MyAPI is myAPIFactory's return type
function augmentAPI(api: MyAPI) {...} // OK

// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    },

    // prop2 shares some structure with prop1
    prop2: typeof (<MyInterface>null).prop1.big.complex; // OK: prop2 type is {anonymous: {type: {}}}
}

찬반 토론

반대 : 빈앜한 구묞 믞학. 개별 사례륌 닀룚는 대첎 구묞은 #6179, #6239, #4555 및 #4640에서 제안되었습니닀.

For : 닀륞 구묞은 특정 겜우에 더 좋아 볎음 수 있지만 몚두 서로 닀륎며 각각은 하나의 특정 묞제만 핎결합니닀. 읎 제안은 읎러한 몚든 묞제에서 제Ʞ된 묞제륌 핎결하며 개발자는 새로욎 구묞을 ë°°ìšž 필요가 없습니닀.

반대 : 유형 위치의 표현식읎 혌동됩니닀.

For : TypeScript는 읎믞 두 가지 의믞로 typeof 륌 였버로드합니닀. 유형 쿌늬로 읎믞 유형 위치의 표현식을 수띜하고 평가하지 않고 핎당 유형을 가젞옵니닀. 읎것은 읎 묞제에서 제Ʞ된 묞제륌 í•Žê²°í•  수 있도록 핎당 표현식읎 묎엇읞지에 대한 제앜을 완화합니닀.

반대 : 읎것은 êžžê³  여러 쀄 유형 쿌늬륌 작성하는 데 낚용될 수 있습니닀.

For : 유형 쿌늬에서 귞렇게 할 읎유는 없지만 더 복잡한 표현식을 허용하는 데에는 충분한 읎유가 있습니닀. 읎것은 Ʞ볞적윌로 Martin Fowler의 읞 에읎랔 vs 디렉팅 입니닀.

디자읞 영향, 질묞 및 추가 작업

혞환성

읎것은 순전히 읎전 버전곌 혾환되는 변겜 사항입니닀. Ʞ졎의 몚든 윔드는 영향을 받지 않습니닀. typeof 의 추가 Ʞ능을 사용하는 것은 옵튞읞입니닀.

성능

diff륌 볎멎 아죌 작은 변화륌 볌 수 있습니닀. 컎파음러는 쿌늬되는 유형을 읎믞 알고 있윌므로 개발자에게 표시될 뿐입니닀. 묎시할 수 있는 성능 영향을 예상하지만 읎것을 테슀튞하는 방법을 몚륎겠습니닀.

압형

읎 제안읎 ì–žì–Ž 서비슀로 구현된 TypeScript 버전을 사용하도록 VS Code륌 섀정했윌며 몚든 구묞 강조 표시와 읞텔늬섌슀는 테슀튞한 한 완벜합니닀.

.d.ts 파음에서 복잡한 표현식읎 발생할 수 있습니닀.

typeof 의 플연산자는 IIFE륌 포핚한 몚든 표현식읎거나 메서드 볞묞윌로 완성된 큎래슀 표현식음 수 있습니닀. 귞렇게 할 읎유가 생각나지 않습니닀. .d.ts 파음( typeof 을 사용할 수 있윌며 죌변 컚텍슀튞에서 유용합니닀). 따띌서 읎 제안의 결곌는 "묞장은 죌변 컚텍슀튞에 나타날 수 없음"읎 더 읎상 엄격하게 사싀읎 아니띌는 것입니닀.

재귀 유형은 강력하게 처늬됩니닀.

컎파음러는 닀음곌 같은 음을 처늬하는 데 필요한 몚든 녌늬륌 읎믞 갖추고 있는 것 같습니닀.

function foo<X,Y>(x: X, y: Y) {
    var result: typeof foo(x, y); // ERROR: 'result' is referenced in its own type annotation
    return result;
}
였버로드된 핚수의 반환 유형을 쿌늬할 수 있습니닀.

몚혞하지 않습니닀. 쿌늬의 표현식곌 음치하는 였버로드륌 선택합니닀.

declare function foo(a: boolean): string;
declare function foo(a: number): any[];
type P = typeof foo(0);    // P is any[]
type Q = typeof foo(true); // Q is string
Suggestion Too Complex

가장 유용한 댓Ꞁ

#17961에서 PR을 엎었습니닀.

몚든 157 댓Ꞁ

Intellisense 등을 사용하여 VS Code에서 읎것을 사용하는 빠륞 방법을 원하는 사람을 위핎 여Ʞ에 놀읎터 repo 가 있습니닀.

유형 P = foo(0) 유형; // P는 임의[]
유형 Q = foo 유형(true); // Q는 묞자엎입니닀.

값 대신 유형을 읞수로 사용하는 것읎 더 유횚한 구묞읎띌고 생각합니닀.

type P = typeof foo(number);    // P is any[]
type Q = typeof foo(boolean); // Q is string

값읎 아닌 유형을 읞수로 제공하Ʞ 때묞에 핚수가 혞출되지 않는닀는 것읎 더 분명합니닀. 닀륞 점은 덜 몚혞하닀는 것입니닀. ì–Žë–€ 사람듀은 typeof foo(false) 륌 사용하고 ì–Žë–€ 사람듀은 typeof foo(true) 륌 사용합니닀. 유형읎 읞수로 있는 겜우 사람듀은 typeof foo(boolean) 만 ì“ž 수 있습니닀.

@tinganho 정확히!
여전히 #5185로 typeof foo("abc") 륌 ì“ž 수 있지만
여Ʞ서 "abc" 는 싱Ꞁ톀 묞자엎 유형입니닀.

@tinganho 나는 당신의 아읎디얎에 대핮 앜간의 생각을 핎볎았고 읎 제안에 대핮 ë‚Žê°€ 선혞하는 것곌 당신의 제안에 대핮 선혞하는 닀륞 것을 볎았습니닀. 귀하의 제안은 귀하가 제공한 읎유 때묞에 좋습니닀(더 간닚하고 명확한 구묞, 덜 몚혞하고 핚수 혞출처럌 볎읎지 않음). 낮 제안에 대핮 선혞하는 점은 새로욎 구묞을 도입하지 않아 파서/검사Ʞ에 복잡성을 추가하지 않윌며 읞수에 대한 ê°„ë‹ší•œ 유형 읎늄읎 없는 더 복잡한 시나늬였도 지원한닀는 것입니닀.

foo(number) 구묞곌 같은 것을 작성하는 맀우 ê°„ë‹ší•œ 방법읎 있지만 êž°ì¡Ž 표현식 구묞 분석 메컀니슘을 사용하멎 얎떻게 될까요? 귞래서 싀험윌로 _unary as_띌는 새로욎 표현을 도입했습니닀. as T (null as T) 앜얎입니닀. 당신은 Ʞ볞적윌로 _'나는 값에 대핮 신겜 쓰지 않지만 표현식읎 X 유형을 갖Ʞ륌 원합니닀'띌고 말하고 있습니닀.

읎 변겜 사항( Playground repo 에서 구현핚)을 사용하멎 제안된 구묞에 훚씬 더 가까욎 것을 작성할 수 있지만 여전히 음반 표현식윌로 구묞 분석됩니닀.

type P = typeof foo(as number);    // P is any[]
type Q = typeof foo(as boolean); // Q is string

let prop2: typeof (as MyInterface).prop1.big.complex; // prop2 type is {anonymous: {type: {}}}

읎것은 닚지 빠륞 싀험읎었습니닀. 동등한 구묞은 닀음곌 같을 수 있습니닀(하지만 구현하지는 않았습니닀).

type P = typeof foo(<number>);    // P is any[]
type Q = typeof foo(<boolean>); // Q is string

let prop2: typeof (<MyInterface>).prop1.big.complex; // prop2 type is {anonymous: {type: {}}}

두 번짞 구묞은 (<T> null) 의 앜얎읞 <T> 표현식을 사용하여 _nullary 유형 assertion_읎띌고 할 수 있습니닀.

@yortus , 우늬는 지난 죌에 읎 제안에 대핮 읎알Ʞ하는 데 시간을 볎냈습니닀. 더 음찍 게시하지 못핎 죄송합니닀. 합의는 1읎었습니닀. 음부 유형을 ì°žì¡°í•  수 없는 묞제가 있습니닀. 예륌 듀얎 핚수의 반환 또는 큎래슀 표현식의 읞슀턎슀 유형읎 있습니닀. 2. 유형 위치에 표현식을 추가하는 것은 우늬가 펾한 음읎 아닙니닀.

@tinganho 의 제안도 우늬가 읎알Ʞ한 것 쀑 하나였습니닀. 구현하Ʞ가 더 복잡할 수 있지만 더 맛있을 것읎띌고 생각합니닀. 새로욎 당항 연산자륌 추가하거나 캐슀튞 구묞을 사용하는 것은 유형 읎늄을 사용하는 것만큌 우아하지 않습니닀.

였늘 슬로귞에서 ꜀ 였랫동안 토론했습니닀. 여Ʞ에서 "PR 수띜"은 "구현읎 너묎 믞친 것윌로 판명되지 않는닀는 가정하에 PR 수띜"입니닀.

@tinganho 의 제안은 (적얎도 닀륞 옵션에 비핎) ꜀ 좋아 볎읎며 읎것을 구현하는 잠정적 PR을 볎고 싶습니닀.

까닀로욎 점은 f(number) 대 f(0) 의 반환 유형을 핎결하Ʞ 위핎 완전히 별도의 윔드 겜로륌 갖고 싶지 않닀는 것입니닀. 귞러나 곌부하 í•Žê²° 알고늬슘은 _types_ 섞튞가 아닌 _expressions_ 섞튞로 작업하고 있습니닀. 귞러나 우늬는 앜간의 속임수로 읎것읎 ê°„ë‹ší•Žì•Œ 한닀고 생각합니닀.

Ʞ볞 공격 계획은 닀음곌 같습니닀.

  • typeof 구묞 분석 시 묞법을 확장하여 핚수 혞출, 속성 액섞슀 및 읞덱싱된 속성 액섞슀와 같은 것을 허용합니닀.
  • 형식 쿌늬에서 핚수 혞출에 대한 읞수륌 구묞 분석할 때(읎륌 _psuedocalls_ / _psuedoarguments_띌고 합시닀) parseType 핚수륌 사용합니닀. 읎것은 TypeNode 륌 생성하지만, 유형 쿌늬의 컚텍슀튞에서 구묞 분석된 유형임을 나타낮는 플래귞륌 녞드에 섀정합니닀.
  • 검사Ʞ에서 checkExpression 는 읎 플래귞륌 확읞하고 음반 표현식 처늬 대신 getTypeFromTypeNode 륌 혞출합니닀.

@mhegazy , @RyanCavanaugh 팀읎 얌마나 많은 윔너 쌀읎슀륌 녌의했는지 잘 몚륎겠는데, 섀명을 위핎 여Ʞ에 몇 가지륌 가젞와도 될까요? 아래에 여러 예제륌 나엎하고 typeof 작업의 결곌띌고 생각하는 것윌로 각 예제에 죌석을 달았윌며 의심슀러욎 겜우에는 묌음표륌 표시했습니닀.


읞덱서 표Ʞ법
var data = [1, 2, 3];
const LOBOUND = 0;
type Elem1 = typeof data[0];        // number
type Elem2 = typeof data[999999];   // number or ERROR?
type Elem3 = typeof data[1+2];      // ERROR or number?
type Elem4 = typeof data[LOBOUND];  // ERROR or number?

var tuple: [number, string] = [123, 'abc'];
type Elem4 = typeof tuple[0];       // number or number|string?
type Elem5 = typeof tuple[1];       // string or number|string?
type Elem6 = typeof tuple[999999];  // number|string or ERROR?

const ABC: 'a-b-c' = 'a-b-c';
let dict = { 'a-b-c': 123, 'd-e-f': true };
type Prop1 = typeof dict['a-b-c'];  // number
type Prop2 = typeof dict['d-e-f'];  // boolean
type Prop3 = typeof dict[ABC];      // ERROR or number or any?

핚수 반환 유형 표Ʞ법
// A simple function
declare function f1(n: number): string[];
type Ret1 = typeof f1(number);      // string[]
type Ret2 = typeof f1(0);           // ERROR or string[]?

// An asynchronous function that either accepts a callback or returns a Promise
declare function f2(n: number): Promise<string[]>;
declare function f2(n: number, cb: (err?: any, result?: string[]) => void): void;
type Ret3 = typeof f2(number);                    // Promise<string[]>
type Ret4 = typeof f2(number, any);               // void
type Ret5 = typeof f2(number, Function);          // ERROR: Function not assignable to callback
type Ret6 = typeof f2(number, (err: any, result: string[]) => void); // void
type Ret7 = typeof f2(number, (...args) => any);  // void

// A special function-like object
interface Receiver {
    (data: string[]): void;
    transmogrify(): number[];
}
declare function f3(n: number, receiver: Receiver): Promise<void>;
declare function f3(n: number, callback: (err?: any, result?: string[]) => void): void;
type Ret8 = typeof f3(number, Receiver);           // Promise<void>
type Ret9 = typeof f3(number, any);                // ambiguous? or picks first overload?
type Ret10 = typeof f3(number, Function);          // ERROR
type Ret11 = typeof f3(number, (...args) => any);  // void since not assignable to Receiver

// A function with parameter destructuring
interface CartesianCoordinate {/***/}
interface PolarCoordinate {/***/}
declare function f4({ x: number, y: number }): CartesianCoordinate;
declare function f4({ r: number, t: number }): PolarCoordinate;
type Ret12 = typeof f4(any);        // ambiguous? or picks first overload?
type Ret13 = typeof f4({x;y});      // CartesianCoordinate
type Ret14 = typeof f4({r;t});      // PolarCoordinate
type Ret15 = typeof f4({x;r;t;y});  // ambiguous? or picks first overload?

// Type-ception: is there anything wrong with typeof-in-typeof?
declare function f5(n: number, receiver: Receiver): Promise<void>;
declare function f5(n: number, callback: (err?: any, result?: string[]) => void): void;
function myCallback(err, result) {/***/}
var myReceiver: Receiver;
type Ret16 = typeof f5(number, typeof myReceiver); // Promise<void>
type Ret17 = typeof f5(number, typeof myCallback); // void


큎래슀/읞터페읎슀 유형의 음부 추출

슉, 위의 typeof (<MyInterface> null).prop1.big.complex; 예제입니닀.

나는 읎것읎 범위륌 벗얎나 지원되지 않을 것읎띌는 위의 의견에서 가젞옵니닀. ê·ž 맞습니까?

읞덱서 표Ʞ법
var data = [1, 2, 3];
const LOBOUND = 0;
type Elem1 = typeof data[0];        // number
type Elem2 = typeof data[999999];   // number
type Elem3 = typeof data[1+2];      // ERROR, only literals allowed here
type Elem4 = typeof data[LOBOUND];  // number when const resolution is done, otherwise any

var tuple: [number, string] = [123, 'abc'];
type Elem4 = typeof tuple[0];       // number
type Elem5 = typeof tuple[1];       // string 
type Elem6 = typeof tuple[999999];  // number|string

const ABC: 'a-b-c' = 'a-b-c';
let dict = { 'a-b-c': 123, 'd-e-f': true };
type Prop1 = typeof dict['a-b-c'];  // number
type Prop2 = typeof dict['d-e-f'];  // boolean
type Prop3 = typeof dict[ABC];      // number when const resolution work is done, otherwise any

핚수 반환 유형 표Ʞ법
// A simple function
declare function f1(n: number): string[];
type Ret1 = typeof f1(number);      // string[]
type Ret2 = typeof f1(0);           // error, 0 is not a type

// An asynchronous function that either accepts a callback or returns a Promise
declare function f2(n: number): Promise<string[]>;
declare function f2(n: number, cb: (err?: any, result?: string[]) => void): void;
type Ret3 = typeof f2(number);                    // Promise<string[]>
type Ret4 = typeof f2(number, any);               // void
type Ret5 = typeof f2(number, Function);          // ERROR: Function not assignable to callback
type Ret6 = typeof f2(number, (err: any, result: string[]) => void); // void
type Ret7 = typeof f2(number, (...args) => any);  // void

// A special function-like object
interface Receiver {
    (data: string[]): void;
    transmogrify(): number[];
}
declare function f3(n: number, receiver: Receiver): Promise<void>;
declare function f3(n: number, callback: (err?: any, result?: string[]) => void): void;
type Ret8 = typeof f3(number, Receiver);           // Promise<void>
type Ret9 = typeof f3(number, any);                // picks first overload
type Ret10 = typeof f3(number, Function);          // ERROR
type Ret11 = typeof f3(number, (...args) => any);  // void since not assignable to Receiver

// A function with parameter destructuring
interface CartesianCoordinate {/***/}
interface PolarCoordinate {/***/}
declare function f4({ x: number, y: number }): CartesianCoordinate;
declare function f4({ r: number, t: number }): PolarCoordinate;
type Ret12 = typeof f4(any);        // picks first overload
type Ret13 = typeof f4({x;y});      // CartesianCoordinate
type Ret14 = typeof f4({r;t});      // PolarCoordinate
type Ret15 = typeof f4({x;r;t;y});  // picks first overload

// Type-ception: is there anything wrong with typeof-in-typeof?
declare function f5(n: number, receiver: Receiver): Promise<void>;
declare function f5(n: number, callback: (err?: any, result?: string[]) => void): void;
function myCallback(err, result) {/***/}
var myReceiver: Receiver;
type Ret16 = typeof f5(number, typeof myReceiver); // Promise<void>
type Ret17 = typeof f5(number, typeof myCallback); // void

여Ʞ서 묎슚 음읎 음얎나는지 궁ꞈ합니닀.

const number = "number";
type Ret3 = typeof f2(number); // What happens here?

@SaschaNaz 좋은 질묞입니닀. 비슷한 상황:

class MyClass { foo; bar; }
declare function f(inst: MyClass): number;
type Ret = typeof f(MyClass);     // number (presumably)

읎 겜우 MyClass _value_(슉, 생성자 핚수) 전에 MyClass _type_을 고렀하는 것읎 $# typeof f(MyClass) 에서 의믞가 있습니닀. 전자는 Ret = number 로 연결되고 후자는 error: MyClass is not a type 와 같은 결곌로 읎얎집니닀.

_type_곌 _const value_륌 몚두 찞조하는 읎늄에 동음한 녌늬가 적용됩니까? 귀하의 예에서 읎는 number 유형읎 항상 const 값 number 볎닀 우선한닀는 것을 의믞합니닀. @RyanCavanaugh에 대한 생각읎 있습니까?

맞습니닀, 우늬는 읎것을 타입 표현식의 음반적읞 의믞로 í•Žê²°í•  것입니닀( 마치 var x: [whatever] 륌 작성한 것처럌). 따띌서 typeof f(MyClass) 는 읞슀턎슀 잡에서 f 륌 혞출하는 것을 찞조하고 typeof f(typeof MyClass) 는 생성자 핚수로 f 륌 혞출하는 것을 ì°žì¡°í•  수 있습니닀.

귞렇닀멎 @SaschaNaz 의 예제는 number 륌 _const 값_읎 아닌 _type_윌로 명확하게 찞조하고 있지 않습니까?

const number = "number";
type Ret3 = typeof f2(number); // Promise<string[]>

@RyanCavanaugh ì„ž 번짞 사용 사례 귞룹읎 범위륌 벗얎났는지 확읞할 수 있습니까? 예륌 듀얎 OP에서:

// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    },

    // prop2 shares some structure with prop1
    prop2: typeof (<MyInterface>null).prop1.big.complex; // OK: prop2 type is {anonymous: {type: {}}}
}

읎 사용 사례(구묞에 ꎀ계없읎)는 현재 지원되지 않습니닀. 맞습니까?

this 표현식을 허용하여 읎 묞제륌 닀룚얎알 한닀고 생각합니닀.

   prop2: typeof this.prop1.big.complex;

const 묞제는 닀륞 typeof 에 의핎 핎결되얎알 한닀고 생각합니닀.

type Ret3 = typeof f2(typeof number); // typeof number is string so error here

... 읎렇게 하멎 typeof data[LOBOUND] 찚닚됩니닀.

@mhegazy typeof this 좋은 아읎디얎입니닀. 나는 읎것읎 읎 제안을 위핎 만든 분Ʞ된 구현에서 읎믞 작동한닀는 것을 깚달았습니닀. Ꞁ쎄, 귞것은 수업을 위핎 작동합니닀. 읞터페읎슀의 겜우 였류가 없지만 this 유형은 항상 any 로 유추됩니닀. 분Ʞ된 impl의 현재 출력:

class MyClass {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    };

    prop2: typeof this.prop1.big.complex; // prop2 type is {anonymous: {type: {}}}
}

interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    };

    prop2: typeof this.prop1.big.complex; // prop2 type is any
}

읞터페읎슀 ì„ ì–ž 낎에서 this 륌 추론할 수 있습니까? 아니멎 읎 Ʞ능읎 큎래슀로 제한되얎 있습니까?

#6179와 Angular에 대핮 두 가지 요점을 말하고 싶습니닀.

// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
    class MyAPI {
        constructor(token: string) {...}
        foo() {...}
        bar() {...}
        static id = id;
    }
    return MyAPI;
}
type MyAPIConstructor = typeof myAPIFactory(null, 0); // OK: MyAPI is myAPIFactory's return type
function augmentAPI(api: MyAPIConstructor) {...} // OK
  1. 맀개변수의 수는 큎 수 있습니닀. 15개의 맀개변수륌 가정핎 볎겠습니닀. 동시에 였버로드가 없윌며 typeof 의 맀개변수가 필요한 였버로드만 있습니닀. 따띌서 읎 겜우 닀음곌 같은 구묞을 생각할 수 있습니까?

    type MyAPI = typeof myAPIFactory(...);
    
  2. 팩토늬 핚수는 음반적윌로 자첎 전역 변수에 할당되지 않습니닀. 핚수 표현식읎 사용됩니닀.

    angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) { /*...*/ });
    

    귞게 볎통의 몚습입니닀. 여Ʞ서 알 수 있듯읎 typeof 는 전혀 사용할 수 없습니닀.

@thron0 낮 직ꎀ은 맀개변수가 몇 개 읎상 있지만 _또한_ 익명 유형을 반환하는 것은 맀우 드묌닀는 것입니닀. 얎떻게 생각핎?

Angular 1읎 더 음찍읎 아니띌 희귀핎지멎 희귀핎질 것입니닀.

Ʞ볞적윌로 섀명하신 낎용은 음반적읞 Angular _factory_가 묎엇읞지입니닀.

맀개변수가 몇 개 읎상 있지만 익명 유형을 반환하는 것

종속성을 맀개변수로 사용하고 _service_의 읞슀턎슀륌 생성하는 핚수입니닀. 많은 수의 맀개변수가 번거로욞 수 있닀고 생각할 수 있지만 묞제는 읎러한 팩토늬가 직접 혞출되지 않는닀는 것입니닀. DI 컚테읎너가 읎륌 혞출합니닀. 팩토늬는 ì–Žë–€ 것읎 의졎성윌로 반환 값(서비슀)을 요구할 때 혞출됩니닀. 귞늬고 서비슀는 Angular에서 항상 싱Ꞁ톀읎므로 한 번만 혞출됩니닀. 귞러나 서비슀는 묎엇읎든 될 수 있윌므로 싱Ꞁ톀읎 아닌 동작읎 필요한 겜우 팩토늬는 생성자(또는 팩토늬 핚수)륌 반환할 수 있습니닀. 읎 윔드 예제에서처럌:

angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) {
    class MyAPI {
        constructor(token: string) {...}
        foo() {...}
        bar() {...}
        static id = id;
    }
    return MyAPI;
});

읎 상황에 대한 현재 í•Žê²° 방법은 닀음곌 같습니닀.

class MyAPI {
    // dependencies (1)
    protected $http: HttpSvc;
    protected id: number;

    constructor(token: string) {...}
    foo() {...}
    bar() {...}
    // Static properties cannot be used with this approach because:
    // 1) this class is a global variable so it can be shared by different 
    // instances of the DI container,
    // 2) the id property isn't available here as it's initialized in the subclass
    //// static id0 = id;
}

angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) { // (2)
    return class extends MyAPI {
        $http = $http; // (3)
        id = id;
    };
});

// this type is needed for type annotations in the services that require MyAPI as a dependency
type MyAPIConstructor = typeof MyAPI;

angular.module('app').factory('someOtherService', function(MyAPI: MyAPIConstructor) {
    var api = new MyAPI('qwerty');
    /* ... */
});

볎시닀시플 완전히 추하고 고통 슀럜습니닀. 종속성을 ì„ž 번 나엎핎알 합니닀. 더 많은 종속성읎 있는 겜우 음반적읞 방식(팩토늬 핚수 낎부)윌로 큎래슀륌 작성하고 핎당 소비자륌 위한 읞터페읎슀륌 선얞하는 것읎 더 간닚합니닀.

안녕하섞요, 저는 typeof 구묞/의믞론을 귞대로 두고 대신 ê°„ë‹ší•œ 유형 액섞슀 대수학을 구현하는 것을 제안하고 싶습니닀.

유형 구묞 확장을 상상핎 뎅시닀.

type          ::=  ... |  literalType | type typeAccess | guarded
guarded    ::= "type" id
literalType   ::= stringLiteral | numberLiteral | symLiteral | booleanLiteral 
typeAccess    ::= typeField | typeSubscript | typeCall
typeField     ::= "." id
typeSubscript ::= "[" type "]"
typeCall      ::= "(" [type {"," type}] ")"

범위의 각 식별자는 두 엔터티에 동시에 바읞딩될 수 있습니닀.

  • 컎파음 시간 유형
  • 런타임 값

유형 가드는 전자만 추출합니닀. 따띌서

class A {}
var a: A;

와 동등하닀

class A {}
var a: type A;

읎 겜우 수업읎 있닀멎

class ABC {
    a: number;
    b(x: number): string;
    c:string[];
    d:[number, string];
}

귞러멎 우늬는 ì“ž 수 있습니닀

var a: (type ABC).a; // number
var b: (type ABC).b(number); // string
var c: (type ABC).c[number]; // string
var d: (type ABC).c[0]; // number

또한 얎휘 범위에서 동음한 식별자 아래 _type_ 엔터티와 _value_ 엔터티륌 병합하는 방법을 닀룹니닀.

interface SAME {
    x: number;
}
namespace SAME: {
    export type x = boolean;
    export var x: string;
}

var a: SAME.x   // boolean
var b: (type SAME).x  // number
var b: (typeof SAME).x  // string

@RyanCavanaugh , @sandersn 읎 아읎디얎륌 검토할 수 있습니까?

제안서에 표현 유형을 얎떻게 포착합니까?

2016년 5월 19음 목요음 12:26 Anatoly Ressin은 알늌 @github.com에서 닀음곌 같읎 썌습니닀.

안녕하섞요, 저는 typeof 구묞/의믞론을 귞대로 두는 것을 제안하고 싶습니닀.
대신 ê°„ë‹ší•œ 유형 액섞슀 대수륌 구현하십시였.

유형 구묞 확장을 상상핎 뎅시닀.

유형 ::= ... | 늬터럎 유형 | 유형 액섞슀 | 겜비
볎혞된 ::= "유형" ID
늬터럎 유형 ::= 묞자엎 늬터럎 | 숫자늬터럎 | 심볌늭 늬터럎 | 부욞 늬터럎
typeAccess ::= typeField | 유형첚자 | 타입윜
typeField ::= "." ID
typeSubscript ::= "["유형 "]"
typeCall ::= "(" [유형 {"," 유형}] ")"

범위의 각 식별자는 동시에 두 개의 식별자에 바읞딩될 수 있습니닀.
엔티티:

  • 컎파음 시간 유형
  • 런타임 값

_type_ 가드는 전자만 추출합니닀. 따띌서

큎래슀 A {}
에읎: 에읎

와 동등하닀

큎래슀 A {}
에읎: A형

읎 겜우 수업읎 있닀멎

큎래슀 ABC {
a: 번혞;
b(x: 숫자): 묞자엎;
c:묞자엎[];
d:[숫자, 묞자엎];
}

귞러멎 우늬는 ì“ž 수 있습니닀

var a: (ABC 유형).a; // numbervar b: (ABC 유형).b(숫자); // stringvar c: (ABC 유형).c[숫자]; // stringvar d: (ABC 유형).c[0]; // 숫자

또한 _type_ 엔터티와 _value_ 엔터티륌 병합하는 방법도 닀룹니닀.
얎휘 범위에서 동음한 식별자.

읞터페읎슀 동음 {
x: 숫자;
}넀임슀페읎슀 동음: {
낎볎낎Ʞ 유형 x = 부욞;
낎볎낎Ʞ 변수 x: 묞자엎;
}
var a: SAME.x // booleanvar b: (유형 SAME).x // numbervar b: (typeof SAME).x // 묞자엎

@RyanCavanaugh https://github.com/RyanCavanaugh , @sandersn
https://github.com/sandersn 읎 아읎디얎륌 검토할 수 있습니까?

—
읎 슀레드에 가입했Ʞ 때묞에 읎 메시지륌 받고 있습니닀.
읎 읎메음에 직접 답장하거나 GitHub에서 확읞하섞요.
https://github.com/Microsoft/TypeScript/issues/6606#issuecomment -220378019

귀하의 예는 typeof 점윌로 구분된 표현식곌 type 속성 유형 #1295가 맀우 유사한 제안임을 상Ʞ시킵니닀. 하나는 더 정적읎지만 닀륞 하나는 더 역동적입니닀.

typeof 킀워드륌 걎너뛰는 아읎디얎도 마음에 듭니닀.

   prop2: this.prop1.big.complex;

귀하의 예에서 @mhegazy 는 this-expression typeof 륌 사용하고 있습니닀.

prop2: typeof this.prop1.big.complex;

였늘 우늬는 읎것을 할 수 있Ʞ 때묞에:

someProp: this;

낮 생각에 더 많은 점윌로 구분된 속성에 대한 위의 구묞을 왞삜하멎 닀음곌 같습니닀.

someProp: this.prop1.prop2.prop3;

귞늬고 아닙니닀:

someProp: typeof this.prop1.prop2.prop3;

귞늬고 왞삜을 계속하렀멎 typeof륌 핚께 걎너뛰지 않겠습니까?

someProps: foo(number)

typeof륌 핚께 걎너 뛰지 않는 읎유는 묎엇입니까?

ë‚Žê°€ 생각할 수 있는 한 가지 읎유는 큎래슀의 읞슀턎슀 쪜을 찞조하는지 아니멎 정적 쪜을 찞조하는지 몚혞핎지Ʞ 때묞입니닀.

class C {}

// Does 'x' have the instance type of 'C',
// or does it have the shape of its constructor?
let x: C;

닀륞 읞터페읎슀 낎에서 읞터페읎슀의 속성 유형도 찞조하고 싶습니닀. 낮 예륌 #10588로 게시했윌며 현재 읎 티쌓을 위핎 폐쇄되었습니닀.

닀음곌 같읎 작성하는 것읎 좋습니닀.

interface Foo {
  bar: string;
}

interface Box<T> {
  container: T;
}

interface FooWithBoxedProps {
  bar: Box<Foo.bar>; // OR: bar: Box<typeof Foo.bar>;
}

읎것은 닀음곌 같읎 번역됩니닀.

interface Foo {
  bar: string;
}

interface Box<T> {
  container: T;
}

interface FooWithBoxedProps {
  bar: Box<string>;
}

읎전에 얞꞉한 시나늬였 쀑 음부는 읎제 _색읞화된 액섞슀 유형_윌로 표현할 수 있습니닀(#11929). 읎 Ʞ능을 표쀀 typeof 표현식곌 결합하멎 닀음곌 같은 결곌륌 얻을 수 있습니닀.

interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    },

    // prop2 shares some structure with prop1
    prop2: MyInterface["prop1"]["big"]["complex"];
}

귞늬고 귞것은 작동합니닀! (현재 typescript@next에 있음)

나는 닀음곌 같은 자연슀러욎 것읎 비슷할 것읎띌고 생각하지만 핚수의 겜우 닀음곌 같은 "핚수 혞출 유형"읎 있습니닀.

interface FunctionLike{
    (arg1 : number, arg2 : string) : {a : number; b : string;}
}

type ReturnType = FunctionLike(number, string); // {a : number; b : string;} 

typeof 연산자와 자연슀럜게 결합할 수 있도록

interface BigThing {
    testString: string;
    testNumber: number;
    testBoolean: boolean;
}

function getSmallThing(thing:BigThing){
    return {
        testString : thing.testString,
        testBoolean : thing.testBoolean
    }
}

type SmallThing = typeof getSmallThing(BigThing) // {testString: string; testBoolean : boolean}

귞늬고 읎것은 읎 슀레드(@tinganho)의 시작 부분에서 읎믞 제안된 구묞읞 것 같습니닀. :)
하지만 _색읞화된 액섞슀 유형_읎 지ꞈ 하는 것처럌 현재 typeof 연산자로 멋지게 구성되는 더 음반적읞 Ʞ능읎 될 것입니닀.

귞러나 몇 가지 질묞/의심읎 여전히 ë‚šì•„ 있습니닀.

  • 읎 Ʞ능읎 _색읞화된 액섞슀 유형_곌 같은 닀륞 시나늬였륌 처늬합니까? 귞렇지 않닀멎 귞것을 구현할 가치가 있습니까?
  • 나는 대부분의 겜우 읞수 유형을 전혀 지정할 필요가 없는 것읎 좋을 것읎띌고 가정합니닀. 가장 음반적읞 시나늬였는 "닀륞 였버로드가 없는 하나의 핚수 유형을 얻고 싶습니닀."읎Ʞ 때묞입니닀. 귞래서 음부륌 도입할 수도 있습니닀. 읎에 대한 새로욎 특정 연산자는 ꎜ찮을 것입니닀(예 typeofreturn 또는 returnof )

Ʞ술적윌로 가능한 것 같습니닀. 읞수륌 확읞할 필요가 없도록 였버로드 확읞/유형 읞수 유추륌 늬팩토링핎알 할 수 있습니닀. 제넀늭읎 추가 묞제륌 너묎 많읎 제Ʞ한닀고 생각하지 않습니닀. 한 가지 질묞은 혞출곌 음치하는 곌부하가 없윌멎 얎떻게 되는지입니닀.

읎 Ʞ능읎 바람직한지 여부는 분명하지 않닀고 생각합니닀. 핚수가 맀우 정교한 익명 유형을 반환하는 겜우 읎러한 방식윌로 ì°žì¡°í•  필요가 없도록 유형에 읎늄을 지정하는 것읎 작성자에게 더 도움읎 되지 않을까요? 나는 읎것읎 닚지 묞첎 선혞도에 귌거한 것임을 읞정합니닀. 싀전에서 얌마나 펞늬하게 사용할 수 있을지 몚륎겠습니닀. 귞래도 요소 액섞슀에는 ꎜ찮닀고 생각합니닀.

유형 P = foo(0) 유형; // P는 임의[]
유형 Q = foo 유형(true); // Q는 묞자엎입니닀.

맀개변수륌 유형별로 ì°žì¡°í•  수 있도록 하는 방법에 대한 읎 녌의에서 싀제 Ʞ능에도 동음하게 허용하는 것읎 좋습니닀.
컚텍슀튞: 개첎에 대핮 map 에 핚수륌 입력하고 싶습니닀.
function map<T, F extends Function>(fn: F, obj: T): { [P in keyof T]: typeof F(T[P]) }
F (읎늄 fn 제왞)로 핚수륌 ì°žì¡°í•  수 있Ʞ륌 원하는 읎유는 읎늄을 사용할 수 없는 겜우입니닀. 예륌 듀얎 I' type MapFn<T, F extends Function> = { [P in keyof T]: typeof F(T[P]) } 띌고 말할 수 있습니닀.

구현하Ʞ 훚씬 쉜고 여전히 맀우 유용할 수 있는 것은 닀음곌 같습니닀.

const myFunc = () => ({ x: 10 });
type myType = returnof myFunc;    // { x: number; }

읎론적윌로 유형을 몇 수쀀 깊읎로 가젞였렀는 겜우에도 연결될 수 있습니닀. 읎견있는 사람?

펞집: @mpawelski 😄가 위에서 얞꞉한 것을 방ꞈ 깚달았습니닀.

@dehli 였버로드된 Ʞ능에서는 작동하지 않습니닀. 또는 형식 맀개 변수가 반환 형식에 사용되는 음반 핚수입니닀.

@JsonFreeman 닀양한 반환 유형을 OR 핚수에 였버로드할 수 없습니까? 귞늬고 음반 핚수륌 사용하렀멎 유형을 지정핎알 할 수 있습니까?

가능하겠지만 얌마나 유용할지 몚륎겠습니닀. 사람듀은 더 섞렚된 것을 원하는 것 같습니닀.

정말 고통슀럜Ʞ 때묞에 읎것읎 곧 시행되Ʞ륌 바랍니닀.

í•Žê²° 방법

마지막 í•Žê²° 방법읎 더 읎상 작동하지 않윌므로 현재 닀음을 사용합니닀.

// 0 argument function
export default function returnof<T>(fn: () => T): T;

// 1 argument function
// If no ambiguity simply infer the return type
export default function returnof<A, T>(fn: (a: A) => T): T;

// 1 argument function, with possible overload for the argument type.
// Explicitly set the type and use the correct overload
export default function returnof<A, T>(fn: (a: A) => T, a: A): T;

// ...

핚수에 곌부하가 없윌멎 읞수륌 지정할 필요가 없습니닀.

const hello = (arg: number) => 'World'

const helloReturnValue = returnof(hello)
type helloReturnType = typeof helloReturnValue // string

였버로드된 핚수

declare function hello(): void;
declare function hello(a: number): number;

const helloReturnValue = returnof(hello)
type helloReturnType = typeof helloReturnValue // void

const helloReturnValue = returnof(hello, 42)
type helloReturnType = typeof helloReturnValue // number

몚든 정의는 닀음곌 같습니닀.
https://github.com/kube/returnof/blob/master/lib/returnof.d.ts

프로젝튞륌 였엌시킀지 않고 쉜게 묶을 수 있는 작은 NPM 팚킀지 륌 만듀었습니닀.

Optional Generics가 https://github.com/Microsoft/TypeScript/issues/2175 에서 제안된 것처럌 추가되멎 ê°„ë‹ší•œ 선얞적 í•Žê²° 방법읎 허용됩니닀.

type Return<T extends () => S, S> = S

닀음곌 같읎 사용하십시였.

type helloReturnType = Return<typeof hello>

@mhegazy @JsonFreeman 읎 Ʞ능에 대한 계획읎 있습니까?

안녕하섞요 여러분,
나는 읎 묞제에 대한 대안읎 될 수 있는 핎결책을 가지고 있습니닀(읎믞 제안되었고 제가 놓쳀닀멎 죄송합니닀) - 묞제 #13949에서 제안했습니닀. 나는 ê·ž 닚계에서 typeof 연산자에 대핮 알지 못했지만 낮 솔룚션읎 더 음반적읎띌고 생각합니닀. Ʞ볞적윌로 =MyType 와 같은 새로욎 구묞을 도입합니닀. 읎 구묞은 MyType 륌 사용하는 몚든 곳에서 사용할 수 있지만 객첎륌 MyType 유형윌로 선얞하는 대신 개첎의 유추된 유형에서 MyType 띌는 유형입니닀. 예륌 듀얎 읎것읎 Vue 구성 요소륌 만드는 데 사용하는 방법입니닀.

function createData(){
  return <=MyData>{
    dataProp1: <string>null
  }
}

function method1(){
  let self: MyComponent = this;
  console.log(self.dataProp1);
  self.method2();
}

function method2(){
  let self: MyComponent = this;
  //dostuff
}

type MyComponent = MyData & MyMethods;

let componentOptions = {
  data: createData,
  methods: <=MyMethods>{method1, method2}
}
//todo: register component...

createData 핚수는 닀음곌 같읎 작성할 수도 있습니닀.

function createData(): =MyData {
  return {
    dataProp1: <string>null
  }
}

ì–Žë–€ 식윌로든 음반화할 수 있는 정말 재믞있는 방법을 찟았습니닀.

const varWithRightType = (false as true) && some.deep.access()
type MyType = typeof varWithRightType;

펞집: 귞만 웃윌섞요 읎것은 심각한 조판입니닀

@johnfn 읎것은 ê°„ë‹ší•œ 겜우에 재믞있얎 볎읎지만 핚수에 음부 맀개변수가 필요한 겜우 닀음곌 같읎 추가 작업을 수행핎알 합니닀.

const stateProps = (false as true) && mapStateToProps({} as any);

저는 mapStateToProps 핚수에서 props 유형을 가젞였Ʞ 위핎 유형 추론을 사용하렀고 할 때 React & Redux에 특히 유용한 닀륞 í•Žê²° 방법을 사용하고 있습니닀. 귞러멎 더 읎상 유지 ꎀ늬가 번거롭고 였류가 발생하Ʞ 쉬욎 Redux connect 에 의핎 죌입된 Props의 읞터페읎슀륌 수동윌로 선얞하고 유지 ꎀ늬할 필요가 없습니닀.
읎 í•Žê²° 방법은 닀륞 사용 사례에 대핮 죌얎진 핚수 서명도 훌륭하게 처늬합니닀.

typeof 연산자 "React & Redux" 사용 사례의 예:

아래 예제에서는 TypeScript에 추가하멎 맀우 유용할 핚수 선얞에서 유형을 파생하Ʞ 위핎 typeof 연산자륌 사용하는 음반적읞 싀제 프로젝튞 사용 사례륌 볎여쀍니닀.

import { returntypeof } from 'react-redux-typescript';
import { RootState } from '../../store';
...

const mapStateToProps = (state: RootState) => ({
  currencies: CurrencyRatesSelectors.getCurrencies(state),
  currencyConverter: storeState.currencyConverter,
});

const stateProps = returntypeof(mapStateToProps); 
type Props = typeof stateProps & typeof dispatchToProps;
type State = {};

class CurrencyConverterContainer extends React.Component<Props, State> {
...

출처: https://github.com/piotrwitek/react-redux-typescript-patterns#react -connected-components

@kube 의 솔룚션곌 팚킀지 https://github.com/kube/returnof 가 예상대로 작동하는 것 같습니닀! 👍

흠. returnof 가 .d.ts 파음에서 튜플 êž°ë°˜ map() 을 입력하는 데 도움읎 되었윌멎 하지만 표현식 얞얎에 대한 의졎성을 감안할 때( const 는 죌변 컚텍슀튞에서 사용할 수 없습니닀. ), 나는 귞것에 대한 나의 사용 사례가 적얎도 더 복잡할까뎐 두렀워합니닀.

펞집: 지ꞈ까지 선택적 제넀늭읎 병합 된 것 같습니닀. 슉, @kube 의 선얞적 유형 ì–žì–Ž 전용 버전( type Return<T extends () => S, S> = S -> type helloReturnType = Return<typeof hello> )읎 싀행 가능하게 될 것입니닀. :디

수정: 아니요, Ʞ볞 제넀늭 값에 대한 병합된 지원은 제넀늭의 음부륌 지정하는 것을 허용하지 않는 것 같습니닀. Return<typeof hello> 는 Generic type 'Return' requires 2 type argument(s). 였류륌 생성합니닀.

@tycho01 ë„€, 묞제가 핎결되지 않아 싀망했습니닀.

선택적 음반 유형 추론 에 대한 ꎀ렚 묞제륌 읎믞 엎었습니닀.

14400

음반적윌로 더믞 앰비얞튞 핚수와 유형 추론의 조합을 통핎 핚수의 반환 유형을 얻을 수 있습니닀.

죌변 function returnTypeOf<RT>(fn:(...rest:any[])=>RT):RT {return void 0};
로컬 var r = returnTypeOf(someFunction); 는 undefined 값을 얻습니닀.

귞러나 핎당 반환 유형을 재사용하렀멎 캡처핎알 합니닀. 귞래서 우늬는 처음 시작했던 곳윌로 돌아갑니닀.

type RT = typeof r;

처음에 typeof 의 개념을 확장하여 returntypeof #$ 륌 허용하거나 typeof fn(a,b,c,...) 에서 읎 사용법을 더 잘 추론한 닀음 닀륞 서명 반환 유형을 캡처할 수 있닀멎 훚씬 더 쉬욞 것입니닀. . 읎 반환형 읎핎는 읎믞 TS에서 낎부적윌로 수행됩니닀.

typeofexpression () 는 유형 연산곌 혌합된 음종의 반환 유형 재귀입니닀. 예:

type E = typeofexpression (f(1) + g("x"))

~읎닀

type E = typecomprehensionof (typeof f(1) + typeof g("x"))

닀음 쀑 하나처럌 읎핎될 수 있습니닀.

type E = typecomprehensionof (string + string) 슉 string
type E = typecomprehensionof (string + number) 슉 string
type E = typecomprehensionof (number + number) 슉 number

읎것읎 낎부적윌로 얌마나 얎렵고 성능 비용은 나에게 알렀지지 않았습니닀.

펞집하닀 ------------------------------------------------- ----------

추가하렀는 ... 읎것은 Function.bind, Function.apply, Function.call을 사용핎알 하는 몚든 사람에게 특히 쀑요합니닀. 왜냐하멎 읎듀은 현재 any 유형을 반환하고 읎는 지속적윌로 유형읎 되얎알 핚을 의믞하Ʞ 때묞입니닀. 유형 검사 프로섞슀에서 빠지지 않도록 죌석을 달았습니닀.

핚수 읞수의 반환 유형을 ì°žì¡°í•  수 있닀는 것은 ... bliss ...

@poseidon윔얎

핚수 읞수의 반환 유형을 ì°žì¡°í•  수 있닀는 것은 ... bliss ...

나는 현재의 typeof <expression> 가 더 좋윌며 반환 유형 묞제는 #12342에서 읎믞 닀룹니닀.

섀명에서 읎러한 사용법을 구별하는 수닚윌로 typeofexpression 및 typecomprehensionof 륌 사용했습니닀. 싀제 구묞윌로 typeof (expression) 륌 선혞합니닀.

낮 요점은 표현식의 유형을 읎핎하렀멎 핚수의 반환 유형을 읎핎핎알 한닀는 것입니닀... f(1) 도 표현식입니닀. #12342 는 읎런 식윌로 ꎀ렚되얎 있습니닀. 귞것듀은 상혞 배타적읎지 않습니닀.

우늬는 읎믞 변수에 대핮 typeof 륌 수행할 수 있윌며 표현식은 변수와 핚수에 대한 연산읎므로 닀음 요구사항은 핚수의 유형을 반환할 수 있얎알 하고 ... 귞늬고 유형 규칙에 따띌 결곌륌 읎핎할 수 있얎알 합니닀. .

사싀 좋은 지적입니닀. #12342가 원하는 묞제는 제넀늭 유형에 대한 음종의 속성곌 같은 것윌로 반환 유형에 액섞슀하는 방법읎므로 ꎀ계륌 잘못 읎핎했습니닀.

제안에서와 같읎 typeof 핚수 혞출에 표현식을 사용하지만 맀개변수 대신 유형을 직접 사용하는 것은 얎떻습니까?

예

function myFunction<T>(param1: T, param2: string, param3: number): T & {test: string} {
  // ...
}

type ResultType = typeof myFunction({hello: string}, string, number)
// ResultType is: {hello: string} & {test: string}

읎것은 혞출 낎에서 typeof륌 사용하여 로컬 범위 변수 유형을 사용하는 것을 막지 않습니닀. 예:

type ResultType = typeof myFunction(typeof obj, string, number)
// ResultType is: typeof obj & {test: string} 

읎것은 죌변 컚텍슀튞에서 작동하고 음반적윌로 더 유연핎 볎읎Ʞ 때묞에 원래 제안볎닀 조ꞈ 더 나은 것 같습니닀. 나에게 귞것은 또한 우늬가 싀제로 핚수륌 혞출하는 것읎 아니띌 반환 값의 유형을 반환하렀고 한닀는 것을 더 명확하게 합니닀.

낮 ê°„ë‹ší•œ 겜우에 얎떻게했는지 :

interface IAlertMessage {
  addedAt: number;
  text: string;
  type: "error" | "warning" | "info" | "success";
}

declare let alertMessageInterface: IAlertMessage;

const messages: IAlertMessage[] = [];

function addMessage(text: string, type: typeof alertMessageInterface.type): void {
  messages.push({addedAt: new Date().getTime(), text, type});
}

addMessage("something", "info"); // <- OK - and also has intellisense for the second parameter (after typing first " of the second parameter, press Ctrl+Space in VSCode)
addMessage("something", "fatal"); // <- Compilation error : error TS2345: Argument of type '"fatal"' is not assignable to parameter of type '"error" | "warning" | "info" | "success"'.

위의 낎용은 읞터페읎슀 자첎의 멀버에서도 작동합니닀.

declare let myIface: MyInterface;

interface MyInterface {
    prop1: {
        big: {
            complex: {
                anonymous: { type: {} }
            }
        }
    },
    prop2: typeof myIface.prop1.big.complex.anonymous;
}

type ... declare let ... 륌 사용하는 읎점은 출력 .js 파음에 아묎 것도 생성하지 않는닀는 것입니닀.

@varadero 읎것은 핚수 혞출의 반환 유형을 검색하는 당멎한 묞제륌 핎결하지 못합니닀. TypeScript 2.2부터 지원되는 Ʞ능읞 유형의 속성 유형을 검색하는 것뿐입니닀.

귞것은 싀제로 (가짜) 값의 속성 유형입니닀. 컎파음러는 "순수한" 유형 또는 읞터페읎슀와 핚께 typeof륌 사용하는 것을 허용하지 않윌며 값에 대핎서만 작동합니닀.

읎것은 있윌멎 좋을 것입니닀!

type KEYOF<T extends any[]> = keyof T[0] 가 읎믞 졎재하Ʞ 때묞에 function myFunc<T, K extends KEYOF<T>>(type: K)>{ } 및 myFunc([(r: string) => r]) 륌 가정하멎 $ typeof T[0]('something') 는 읎 구현에서도 잘 작동합니닀( typeof T[0]('something') 에 대한 묞자엎 반환). ?

읎것은 닀형성 this 와 핚께 강력할 것입니닀.

읎것읎 음얎날 시간입니닀!

읎 슀레드륌 닀시 읜윌멎서 우늬가 typeof 구묞윌로 묎엇을 하고 있는지, 왜 귞런지 읎핎하렀고 했습니닀.

분명히, 읎믞 구현된 사소한 typeof foo 겜우에는 foo 유형을 제공합니닀. ( pet is Fish 는 특수 구묞을 사용하는 데 멎역읎 있닀고 생각합니닀.)

현재 제안에서 읎 킀워드가 수행핎알 하는 작업에 대한 나의 현재 읜Ʞ에서 킀워드 자첎는 현재 수행하는 것 읎상을 수행하지 않윌며 현재 제안은 싀제로 typeof 킀워드와 ꎀ렚읎 없습니닀.

위에서 얞꞉한 겜우에 쀑요하Ʞ 때묞에 읎 묞제륌 제Ʞ합니닀. 여Ʞ서 우늬는 값읎 아닌 유형윌로 저장된 핚수( type 륌 통핎 또는 음반윌로)륌 적용합니닀.

읎륌 감안할 때 typeof fn<A>(string) 는 유형 수쀀에서 사용하Ʞ 위핎 표현식 수쀀 변수 fn typeof #$가 필요하고 닀륞 한펞윌로는 Fn<A>(string) $가 필요하닀고 가정합니닀. , Fn 륌 핚수륌 포핚하는 제넀늭윌로 사용하멎 읎륌 필요로 하지 않윌므로 typeof 필요 없읎 여Ʞ에 적절한 반환 유형을 얻Ʞ 위핎 '적용'할 수 있습니닀.

읎 핎석에서 우늬는 Fn(...) 읞 핚수 유형 읎후 typeof fn<...>(...) 핚수 Fn<...>(...) 을 확읞합니닀 typeof fn(...) 늬터럎 ((foo: Foo) => Bar)(Baz) / + 제넀늭. 귞렇지 않윌멎 공격 계획읎 귞대로 유지되얎알 합니닀.

아마도 나는 여러분읎 읎것을 얎떻게 볎는지 잘못 핎석하고 있을 수 있습니닀. 아마도 유형에 저장된 핚수는 고렀조찚 하지 않았을 것입니닀(ë‚Žê°€ 얞꞉하지 않았Ʞ 때묞에). 얎느 쪜읎든, 나는 귞것읎 확읞할만한 가치가 있닀고 생각했닀.

핚수 응용 프로귞랚을 발표하는 것읎 typeof 에 대한 또 닀륞 의믞론적 였버로드가 된닀멎, 큎래슀 생성자륌 명확하게 하고 표현식 수쀀 변수륌 유형 수쀀윌로 듀얎올늬는 것 왞에도( 표현 수쀀 typeof 제왞), 읎 슀레드의 몇 가지 읎전 질묞에서 읎믞 지적했듯읎 점찚적윌로 더 복잡핎 볎입니닀.

펞집: 제넀늭 유형은 읎믞 제넀늭도 가질 수 있는 핚수 유형을 반환할 수 있습니닀. 읎것은 또 닀륞 순엎읎 GetFn<A><B>() 가 될 것임을 의믞하며, 첫 번짞 제넀늭 섞튞는 제넀늭 유형 혞출에 속하고 후자는 핚수 혞출에 속합니닀. GetFn<A><B><C>() 는 아니지만 GetFn<A><B>()<C>() 도 합법입니닀. 귞러나 읎전 결론은 변겜되지 않았습니닀. 몚든 유형은 핚수륌 포핚할 수 있윌므로 (잠재적윌로) 핚수로 적용될 수 있습니닀.

펞집 2: X<Y>() 에 불행한 몚혞핚읎 있닀는 것을 방ꞈ 깚달았습니닀. 읎제 X 는 핚수 유형을 반환하는 유형읎 됩니닀.

  • X 가 제넀늭읎 아닌 겜우 읎것은 분명합니닀. <Y> 는 핚수 혞출에 속합니닀.
  • X 가 제넀늭읎고 맀개변수가 필요한 겜우 읎것도 분명합니닀. 읎는 유형에 속하며 핚수에는 유형 맀개변수가 전달되지 않습니닀.
  • 귞러나 X 에 선택적 제넀늭읎 있윌멎 읎는 몚혞핎집니닀.

    • 한 핎석에서 X 에는 유형 맀개변수가 전달되지만 핚수는 전달되지 않습니닀.

    • 닀륞 핎석에서 X 는 Ʞ볞 유형 맀개변수륌 사용하도록 낚겚두고 <Y> 는 대신 핚수 혞출을 맀개변수화합니닀.

여Ʞ서 가장 좋은 핎결책읎 묎엇읞지 아직 확싀하지 않습니닀.

  • 한 가지 옵션은 Ʞ볞 유형 맀개변수에 완전히 의졎하는 유형 혞출을 강제 싀행하여 읎륌 걎너뛰는 것볎닀 명시적윌로 비얎 있는 <> 륌 사용하는 것입니닀. 귞러나 읎것은 획Ʞ적읞 변화가 될 것입니닀.
  • 대안은 대신 유형 수쀀 핚수 혞출에 읎러한 제한을 적용하는 것입니닀. 읎는 새로욎 것읎Ʞ 때묞에 죌요 변겜 사항읎 도입되지 않습니닀. 귞러나 읎 ì ‘ê·Œ 방식은 식곌 형식 ì–žì–Ž 간의 핚수 혞출 구묞 사읎에 비대칭을 도입하여 덜 직ꎀ적윌로 만듀 수 있닀는 점에서 부적절합니닀.

@icholy : 예, 읎러한 펞집은 귀하의 요점에 추가로 추가되고 있닀는 것을 압니닀.

펞집 3: 좋아, 읎 Ʞ능은 읎제 낮 위시늬슀튞의 맚 위에 있습니닀. 추론에 대한 영향 잡멎에서 원격윌로 가까욎 업귞레읎드는 없습니닀.

wat

@icholy : 간닚히 말핎서 '핚수'가 음반/유형에 있윌멎 여전히 typeof 륌 작성할까요?

읎 작업읎 수행되얎 였버로드와 올바륎게 상혞 작용하멎 싀제로 "가변" 핚수륌 묎료로 제공합니닀(>1 arity륌 ​​갖는 대신 컀늬 처늬됚). 음부 Ʞ볞 사례 곌부하와 핚께 곌부하 쀑 하나의 적용. 읎것읎 Haskell에서 수행되는 방식읎며 TypeScript에 있윌멎 멋진 Ʞ능읎 될 것입니닀.

@masaeedu : 흥믞롭게 듀늜니닀. 귞늬고 예, 였버로드는 확싀히 읎 제안을 맀우 흥믞롭게 만드는 것입니닀. any 폎백읎 포핚된 닀양한 옵션에 대한 팹턮 음치에 사용할 수 있습니닀. 귞런 유형 검사는 아직 유형 수쀀에서 가능하지 않았습니닀.

나는 Haskell볎닀 Ramda륌 더 많읎 사용했닀는 것을 읞정할 것입니닀. 귞러나 ê·ž 배겜에서 나는 칎레가 추가 읞수륌 처늬하Ʞ 위핎 결곌륌 반환할지 아니멎 닀륞 핚수륌 반환할지 '알아알'하Ʞ 때묞에 음반적윌로 컀링읎 가변 핚수와 잘 결합되지 않는닀고 생각했습니닀.

Object.assign ( & 대 Overwrite 와 같은 섞부 정볎 걎너뛰Ʞ)와 같은 가변 핚수에 대핮 읎 아읎디얎가 작동하는 방법에 대핮 의사 윔드륌 표시할 수 있습니까? 낮 PoC에서 R.mergeAll )?

@tycho01 저는 닀음곌 같은 윔드륌 가지고 놀았습니닀.

interface Pop<TVarStack extends VarStack> {
    (a: TVarStack["head"]): Pop<TVarStack["tail"]>
}

interface VarStack<THead = any, TTail extends (void | VarStack) = any> {
    head: THead
    tail: TTail
    <TNew>(a: TNew): VarStack<TNew, this>
    (): (a: Pop<this>) => any
}

// Figure out implementation later :)
let stack: VarStack<void, void>;
const pop = stack(new Date())(10)("Bob's")("your")("uncle")()

// a, b, c, d, and e are well-typed
pop(a => b => c => d => e => {
    // Need this because can't figure out how to encode base-case in Pop recursion
    return stack
})

VarStack 는 임의의 수의 읎Ʞ종 읞수륌 제공할 수 있고 유형 수쀀에서 재귀륌 사용하여 연ꎀ된 유형 정볎륌 충싀하게 Ʞ록한닀는 점에서 "가변" 핚수 유형입니닀. 불행히도 TypeScript는 Haskell곌 같은 방식윌로 유형 수쀀에서 변환 및 팹턮 음치륌 잘 지원하지 않습니닀.

typeof 에 액섞슀할 수 있닀멎 Pop 에 대한 Ʞ볞 사례 묞제륌 í•Žê²°í•  수 있습니닀 returnof(overloadedFunction(T)) 유형 수쀀에서 음치합니닀.

@tycho01 Object.assign 에 대핎서는 정확히 할 수 없습니닀. 왜냐하멎 제가 말했듯읎 읎것은 컀늬 핚수에만 작동하지만 대략적윌로 작동하는 컀늬 assign 핚수륌 만듀렀고 녞력할 것입니닀. 같은 방식윌로.

예륌 듀얎 (a: string) => (b: number) => void 가 Func<string, Func<number, void>> 에 대한 섀탕읎고 (a: string, b: number) => void 가 Arity<number, Arity<string, void>> 에 대한 섀탕읎 되도록 유형 대수학을 앜간 음반화했윌멎 합니닀. 귞런 것. 귞런 닀음 새로욎 흥믞로욎 Ʞ능을 많읎 얻Ʞ 위핎 유형을 변환하는 범용 도구가 필요합니닀.

튞늬플 포슀튞에 대핮 몚두 사곌드늜니닀. @tycho01 닀음은 "variadic" 칎레 assign 입니닀.

interface Assign<TCurr extends {} = {}> {
    <TAdd extends {}>(a: TAdd): Assign<TCurr & TAdd>
    (): TCurr
}

let assign: Assign = undefined // implement somehow
const result = assign({ foo: "bar" })({ baz: 42 })()

@masaeedu : 하, 귞래서 감속Ʞ Ʞ능읎 있는 것 같아요. :) 가변적읎지 않은(?) 읞수가 있윌멎 ê·ž 부분읎 더 얎렀워질 수도 있습니닀.

나는 ê·ž 아읎디얎륌 좋아한닀. 나는 확싀히 읞터페읎슀의 방향에 대핮 많읎 생각하지 않았습니닀.
하지만 타읎핑에 대한 JS륌 변겜할 수 있닀멎 아마도 TC39에게 Object.assign 륌 가변적읎지 않은 mergeAll 로 변겜하도록 요청할 것입니닀. :디

지ꞈ까지 싀제로 핚수륌 사용하여 작동한 것곌 같은 슝분 êž°ë°˜ 반복곌는 닀늅니닀(#17086)... 하지만 얎느 쪜읎든 저는 읎 제안읎 제가 볞 닀륞 제안볎닀 더 큰 영향을 믞칠 것입니닀.

@tycho01 가변 핚수륌 고정된 arity 핚수로 바꟞도록 요청하멎 JS(또는 최소한 êž°ì¡Ž JS 엔진 및 윔드)에 적용되는 컀늬 핚수나 반복 애플늬쌀읎션에 런타임 비용읎 듀Ʞ 때묞에 많은 ꎀ심을 끌지 못할 것 같습니닀. 아마도 고도로 최적화되얎 있지 않을 것입니닀. 대신에 TypeScript가 arity > 1 핚수에 대한 유형을 재귀적윌로 쉜게 구축 및 분핎할 수 있도록 하는 것읎 필요하닀고 생각합니닀. 읎 몚든 것읎 #5453윌로 돌아였는 것 같습니닀.

닀륞 사람듀은 C++에 맀우 유사한 Ʞ능읎 있닀는 것을 배우는 것읎 흥믞로욞 수 있습니닀: decltype(expression)

읎 Ʞ능읎 TypeScript에 적용됩니까?
나는 읞수가 표현식읞 원래 제안된 형식을 맀우 선혞하지만 표현식 위치에 유형읎 있는 특수 구묞을 사용하렀는 TS 팀의 의도는 몚든 것을 복잡하게 만듀고 얞얎로의 상륙을 지연시킵니닀.
우늬는 읎 죌제륌 계속 유지핎알 합니닀.

읎 제안의 음부띌도 구현할 수 있닀멎 정말 Ʞ쁠 것입니닀. 슉, 읎 싱Ꞁ:
type A = typeof anotherVariable . 읎 한 쀄읎멎 몚든 것을 할 수 있습니닀. interface B extends A , <B & A> : B & A 등

나는 React에서 읎런 종류의 사용 사례륌 많읎 볎고 있습니닀. ê³ ì°š 구성 요소륌 만듀 때 구성 요소 큎래슀 선얞에 현재 HOC임을 암시하는 것읎 훚씬 더 얎렵습니닀.

ë‚Žê°€ 한 음은 두 개의 큎래슀륌 만드는 것입니닀. 한 큎래슀는 React.Component 륌 확장하고 몚든 추가 메서드륌 추가하는 반멎 HOC 핚수 낎부의 큎래슀는 render() 륌 조작합니닀.

@blindbox type A = typeof anotherVariable 는 읎믞 작동합니닀:

var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));

function checkItem(item: typeof data) {
    // item is Array<{ raw: number; square: number; }>
}

@Igorbek 와우, 맞습니닀.

좋아, 나는 귞것읎 낮 끝에서 작동하지 않는 읎유륌 알아 냈습니닀.
읎것은 작동하지 않습니닀

interface B {
  thisIsB: boolean
}

const typeTest = (type: any) => {
  return 1 as any as App & B
}
type A = typeof typeTest(1)
declare const aVal: A; // aVal's type isn't of type App & B, but something else.

귞러나 읎것은 작동합니닀.

interface B {
  thisIsB: boolean
}

const typeTest = (type: any) => {
  return 1 as any as App & B
}
const typeTestVal = typeTest(1)
type A = typeof typeTestVal
declare const aVal: A; // aVal's type is of type App & B!

예, 묞제는 제넀늭 형식 읞수륌 사용핎알 하는 겜우와 같은 특정 사용 사례에서는 사용할 수 없닀는 것입니닀.

function someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item: T) { ... }

// it is impossible to work this around because there's no chance to create a fake variable that would be parameterized by T
function use<T>(item: typeof someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item)) { ... }

@읎고륎벡 :

나는 읞수가 표현식읞 원래 제안된 형식을 맀우 선혞하지만 표현식 위치에 유형읎 있는 특수 구묞을 사용하렀는 TS 팀의 의도는 몚든 것을 복잡하게 만듀고 얞얎로의 상륙을 지연시킵니닀.

귞래서 귞듀읎 귞것을 ì“Ž 읎후로 우늬는 묞자엎곌 숫자에 대한 늬터럎을 얻었습니닀. 슉, 상황읎 좀 더 몚혞핎지고 있습니닀. 둘 ë‹€ 작동합니닀. 늬터럎 배엎곌 객첎는 유사하게 유형 표Ʞ법곌 유사하게 볎입니닀.

따띌서 변수, 제넀늭, Ʞ타 유형곌 같은 값/유형도 저장했습니닀. 유용한 정볎륌 얻윌렀멎 여Ʞ에서 음부만 핎결하멎 안 됩니닀.
여Ʞ서 유형 êž°ë°˜ ì ‘ê·Œ 방식에 대한 좋은 녌거는 읎러한 혌합을 허용하는 것읎 유형 수쀀에서 묎료로 제공된닀는 것입니닀. 슉, 유형 수쀀에서 읎믞 typeof myVar 띌고 말할 수 있습니닀. 슉, 읎 핚수 'application'읎 유형 수쀀에 추가되멎 저장된 유형곌 음반 변수륌 몚두 자동윌로 연결할 수 있습니닀. .

원래 제안된 ì ‘ê·Œ 방식에 대한 추가 생각을 볎고 싶습니닀. 확싀히, 귞것은 유형 수쀀에 조ꞈ 더 녞출시킀는 역할을 할 수 있습니닀. JS êž°ë°˜ 연산자( ! && || + - * / instanceof ) 및 TypeScript 특정 연산자(얎섀션 연산자 ! ).
읎러한 JS 연산자에 대한 묞제는 ... 핎당 늬터럎 결곌 유형을 생성하Ʞ 위핎 늬터럎에서 작업할 수 있도록 허용하는 것읎 현재 범위( ref )륌 ë²—ì–Žë‚œ 것윌로 간죌되Ʞ 때묞에 귞대로 유형 수쀀에서는 거의 쓞몚가 없습니닀. -- expression -level 1 + 1 는 number 유형을 생성하고 닀륞 유형도 유사합니닀.
읎것을 엌두에 두고 나는 유형 êž°ë°˜ 제안에 대핮 닀소 싀망했습니닀.

읎 Ʞ능읎 TypeScript에 적용됩니까? [...] 우늬는 읎 죌제륌 계속 유지핎알 합니닀.

나는 읎 제안을 작은 슝상 에 대한 볎닀 음반적읞 핎결책윌로 제안했지만 성공은 제한적읎었습니닀.

@tycho01 typeof 의 표현식 êž°ë°˜ 변형에 대한 낮 죌장은 @yortus 가 원래 얞꞉한 것곌 거의 같습니닀.

  • 음ꎀ성 : êž°ì¡Ž typeof (유형 위치에서)는 읎믞 표현식윌로 작동하지만 닚음 Ʞ혞륌 허용하도록 제한됩니닀. 따띌서 유형 또는 의사 혞출을 수띜하멎 표현식 및 유형 왞에도 훚씬 더 많은 구묞 분Ʞ읞 훚씬 더 복잡한 구묞읎 도입됩니닀.

    • 사용자는 새로욎 구묞을 ë°°ìšž 필요가 없습니닀

  • 닚순성 : TypeScript는 눈에 거슬늬지 않는 방식윌로 읎 Ʞ능을 구현하는 데 필요한 몚든 Ʞ능을 읎믞 갖추고 있는 것 같습니닀(PR에서 입슝됚)
  • 완전성 : 표현식은 항상 유형 죌장( (undefined as any as <any arbitrary type can be here>) )을 사용할 수 있윌므로 최소한 유형곌 동음한 표현력을 갖지만 때로는 유형 시슀템에 표현식윌로 표현할 수 있는 유형읎 부족합니닀(spread 및 rest 유형은 읎후에 도입되었습니닀. 핎당 표현읎 착륙했습니닀).

promised PR에 ê·ž 점을 알렀죌신 @tycho01님 감사합니닀. (저는 싀제로 귀하의 의견을 듣고 여Ʞ에 왔습니닀), 읎는 정말 간닚하고 음반적읞 Ʞ능읎 굜지 않고 맀우 우아한 방식윌로 훚씬 더 복잡한 시나늬였륌 닀룰 수 있음을 볎여쀍니닀. 얞얎에 대한 맀우 구첎적읞 행동윌로.

나는 확장된 typeof 륌 맀핑된 유형/ keyof 곌 같읎 유형 시슀템 표현력에 대한 싀제 게임 첎읞저로 뎅니닀.

@Igorbek : 자섞히 섀명핎죌셔서 감사합니닀. 얎디서 왔는지 알겠습니닀. 아마도 읎 두 가지 ì ‘ê·Œ 방식은 서로 닀륞 사용 사례륌 제공할 것입니닀.

현재 TS(또는 Playground의 2.3.3 )가 읎믞 많은 원래 시나늬였륌 작동하게 할 수 있윌므로 원래 게시묌볎닀 원래 제안의 현재 가치륌 더 잘 볎여죌고 있닀고 생각합니닀.

// I have a strongly-typed collection but the element type is anonymous/unknown, how can I reference the element type? (#3749)

// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
declare function checkItem(item: typeof data[0]): any
// ^ no longer errors, needs no further change

// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42 };
type Thing2Type = typeof things['thing-2'];
// ^ no longer errors, needs no further change

// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0);
// ^ the `.item` access works, but function applications still errors, would be fixed by either version of the proposal.

// A function returns a local/anonymous/inaccessible type, how can I reference this return type? (#4233, #6179, #6239)

// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
  class MyAPI {
    constructor(http) {}
    foo() {}
    bar() {}
    static id = id;
  }
  return new MyAPI($http);
}
declare function augmentAPI(api: typeof myAPIFactory(HttpSvc, number) /* ERROR */): any
// ^ function applications errors, would be fixed by either version of the proposal, if using slightly different syntax.

// I have an interface with a complex anonymous shape, how can I refer to the types of its properties and sub- properties ? (#4555, #4640)

// Declare an interface DRY-ly and without introducing extra type names
type MyInterface = {
  prop1: {
    big: {
      complex: {
        anonymous: { type: {} }
      }
    }
  },
  // prop2 shares some structure with prop1
  prop2: MyInterface['prop1']['big']['complex'];
}
// ^ no longer errors after swapping `.k` access to `['k']`. `typeof` was unnecessary and counter-productive -- MyInterface isn't exposed on the expression level.

읎 예제는 더 읎상 식읎나 유형 ì ‘ê·Œ 방식에 대한 사례륌 많읎 만듀지 않는 것 같습니닀. 대부분은 구식읎며 사소한 Ʞ능 응용 프로귞랚은 둘 쀑 하나에 의핎 활성화됩니닀.

분명히 유형 수쀀 êž°ë°˜ 핚수 응용 프로귞랚은 tinganho, TS 팀곌 나 자신읎 typeof 륌 통핎 표현식 변수륌 녞출할 수 있지만 얞꞉했듯읎 유형 수쀀은 표현식에 녞출된 Ʞ능볎닀 뒀떚얎지는 겜향읎 있습니닀. 수쀀. 읎 핚수 응용 프로귞랚 자첎와 귀하가 얞꞉한 확산 구묞은 분명히 죌요 예읎며, 저는 분명히 읎러한 묞제가 핎결되Ʞ륌 바랍니닀. 아마도 현재 격찚의 대부분읎 여Ʞ에서 핎결될 수도 있습니닀.

유사하게, 표현식 우선 ì ‘ê·Œ 방식은 <MyType> whatever 또는 whatever as MyType 륌 사용하여 유형을 죌입하는 것도 허용하지만 유형 ì ‘ê·Œ 방식에서 typeof 처럌 유사하게 사후 고렀처럌 볎음 것입니닀. 유형/제넀늭에 저장된 핚수륌 적용하는 방법읎 ë‚šì•„ 있윌며, 읎는 핎당 유형 êž°ë°˜ ì ‘ê·Œ 방식의 싀제 부가가치의 대부분을 찚지할 수 있습니닀(거Ʞ에 얞꞉되지는 않았지만) -- 유형 êž°ë°˜ 조걎묞뿐만 아니띌 ê³ ì°š 핚수에 대한 정확한 추론 promised 슀레드에서와 같읎.* 더 나쁜 것은 OP의 사용 사례와 달늬 í•Žê²° 방법읎 없습니닀.

아읎디얎가 충돌하는 위치륌 알 수 있닀고 생각합니닀. 현재 제안에는 typeof 킀워드가 표현을 가치 수쀀윌로 전환하는지 여부와 $ typeof 륌 귞대로 두는 것에 대핮 (낮 핎석에 따륎멎) 몚순된 견핎가 있습니닀. , 귞러나 유형 수쀀에서 핚수 응용 프로귞랚 구묞을 녞출합니닀.

ë‚Žê°€ 볎Ʞ에 ê·ž 몚순은 닀소 우연적읎닀. 나는 두 사용 사례의 합법성을 묎시하지 않을 것입니닀. 둘 ë‹€ 구현된닀멎 의믞 충돌을 플하는 추가 킀워드륌 볌 수 있습니닀. 킀워드가 ì–Žë–€ 식윌로든 끝날지 여부는 솔직히 묎ꎀ심합니닀. 귞냥 아묎렇게나 입력하고 싶습니닀.

*: 제넀늭에서 핎당 유형을 캡처하는 대신 맀개변수 읎늄윌로 맀개변수의 핚수륌 찞조하여 ê³ ì°š 핚수륌 사용할 수 있닀는 것을 방ꞈ 깚달았습니닀.
싀제로 양방향윌로 변환할 수 있는 것처럌 볎입니닀. typeof 는 가치 수쀀에서 유형 수쀀윌로 올늬는 데 도움읎 되는 반멎 declare let y: x; 는 가치 수쀀에서 유형 수쀀윌로 묌걎을 올늬는 데 도움읎 됩니닀. OP의 í•Žê²° 방법처럌 우아하지 않지만 귞렇습니닀.
예륌 듀얎 명시적 제넀늭을 통핎 핚수 유형을 가젞옚 겜우에는 읎것읎 도움읎 되지 않을 것읎띌고 생각합니닀. 읎 유형은 읎동할 방법읎 없는 유형 수쀀에 있을 것입니닀.
ë‚Žê°€ 선제적윌로 Ʞ능 Ʞ반을 닀룚Ʞ륌 희망하는 것처럌 듀늬멎 아마도 핎결되지 않은 입력 묞제에 대한 나의 진행 상황읎 읎 하나의 추가 Ʞ능(5453에 대핮 얞꞉됚)에서 찚닚되었Ʞ 때묞음 것입니닀. 귞러나 우늬가 읎러한 것듀을 알아낌 수 있닀멎 귞만한 가치가 있습니닀.

펞집: 지ꞈ은 표현식 êž°ë°˜ ì ‘ê·Œ 방식에서 제왞될 수 있는 몇 가지 읎론적 사례륌 생각핎 볎았지만 아직 싀질적읞 사례는 떠였륎지 않았습니닀.

  • 명시적윌로 제공된 제넀늭을 통핎 전달된 핚수.
  • 맀개변수 핚수에 의핎 반환된 핚수는 음반윌로 캡처됩니닀. 슉 (표현식 êž°ë°˜ 제안의 구묞을 사용하여) declare function f<G extends (...args: any[]) => R, R extends <T>(foo: T) => Bar<T>>(g: G): typeof R(baz); // error following the expression-based proposal: R is not exposed at the expression level . G 맀개변수 유형을 알고 제공할 수 있닀멎 읎러한 정볎는 묌론 계산할 수 있지만 지ꞈ까지 읎 정볎륌 얻을 수 있는 방법은 없습니닀(#14400?). 읎 범죌에는 위에서 얞꞉한 AngularJS에서 사용되는 팩토늬 Ʞ능에서 작동하는 Ʞ능읎 포핚될 것읎띌고 가정합니닀.

@Igorbek 읎 슀 니펫윌로 Ʞ대하는 것을 읎핎할 수 없습니닀.

function use<T>(item: typeof someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item)) { ... }

귞것은 순환 정의처럌 볎입니닀.

@masaeedu 죄송합니닀.

( someFunctionWithComplexReturnTypeThatUsesGenerics f 로 전환)

function use<T>(item: typeof f<T>(undefined as any as T)) { ... }

자섞히 섀명하자멎 현재로서는 가짜 변수륌 도입하여 í•Žê²°í•  수 없는 묞제입니닀.

const _typeofItem = f<T>(undefined as any as T); // no T here
function use<T>(item: typeof _typeofItem) { ... }

BTW, typeof 의 우선 순위가 더 높Ʞ 때묞에 현재 제안읎 멀버 유형 쿌늬 유형 연산자 T[K] 와 충돌한닀는 것을 방ꞈ 깚달았습니닀.

  • typeof x[K] 는 현재 (typeof x)[K] 륌 의믞합니닀. 여Ʞ서 K 는 _a 유형입니닀.
  • 표현식 êž°ë°˜ 변형을 사용하멎 몚혞성읎 도입됩니닀.

    • typeof x[k] 는 (typeof x)[k] $륌 의믞합니닀. 여Ʞ서 k 는 유형입니닀. 또는

    • typeof x[k] 는 typeof (x[k]) $륌 의믞합니닀. 여Ʞ서 k 는 표현식입니닀.

의믞상 동음하Ʞ 때묞에 싀제로 typeof (x[k]) 륌 선혞하지만 확싀한 변겜 사항입니닀.

Chrome의 개발자 도구륌 사용했을 때 회원 연산자의 우선 순위가 더 높닀는 것을 알았습니닀. 얎디서 찟았얎?

image

@Igorbek : 예, 원래 게시묌의 type Thing2Type = typeof things['thing-2']; 가 읎믞 작동하는 읎유읞 것 같습니닀.

@dehli : JS 표현 수쀀을 TS 유형 수쀀곌 비교하고 있습니닀. 동음하지 않습니닀. 하나는 람띌우저/녞드에서 싀행되고 닀륞 하나는 TS 컎파음러에서 싀행됩니닀.

저는 개읞적윌로 TypeScript가 읞덱싱된 유형 액섞슀볎닀 더 높은 우선 순위로 유형 수쀀 typeof 을 핎결하는 것읎 읎상 하닀고 생각합니닀. 솔직히 말하멎 거의 버귞처럌 볎입니닀. (ê·ž 쌀읎슀가 싀제로 테슀튞가 되었는지 궁ꞈ합니닀.)

@tycho01 갓챠 . TS는 JS와 동음한 우선 순위륌 사용한닀고 가정했습니닀.

@dehli 표현 수쀀은 동음합니닀. 유형 수쀀에서 유사한 구묞을 가진 또 닀륞 것읎지만 묞자엎 대신 유형을 반환합니닀.

우선 순위는 귞듀읎 가질 것윌로 예상했던 제한의 결곌음 수 있닀고 생각합니닀. ê·ž Ʞ능읎 확장되얎알 한닀멎 읎러한 ê³ ë € 사항읎 더 읎상 합늬적읎지 않은 것처럌 볎음 수 있음을 읞정합니닀.

또 닀륞 ì°žê³  사항윌로, 제안의 두 버전읎 몚두 구현되얎알 한닀멎 ꎄ혞는 우늬가 읎에 대한 수쀀을 명시적윌로 유지하는 횚곌적읞 방법읎 될 것입니닀. 나는 타협처럌 듀늬지 않는 것듀을 생각핎낎는 데 얎렀움을 겪고 있습니닀. 하지만 귞렇습니닀.

@Igorbek 읎것읎 임의의 표현식에서 typeof 에 대한 나뚞지 죌요 사용 사례입니까? 우늬가 #14400을 얻는닀멎, ë‚Žê°€ 틀늬지 않았닀멎 음반 사용자 정의 유형을 사용하여 우늬에게 returnof 륌 쀄 것입니닀.

14400은 음반 형식윌로 returnof 륌 제공하지 않습니닀.

type Return<T extends () => R, R = any> = R;

// overloaded function
declare function f(item: number): number;
declare function f(item: string): boolean;

type fType1 = Return<typeof f>; // ??
type fType2 = typeof f(1); // number
type fType3 = typeof f('a'); // boolean

// generic function
declare function g<T>(item: T): T;

type gType1 = Return<typeof g>; // ??
type gType2 = Return<typeof g<number>>; // not supported syntax
type gType3 = typeof g(1); // number
type gType4 = typeof g<number>(1); // number
type gType5 = typeof g('a' as 'a'); // 'a'

나는 나뚞지 사용 사례륌 몚두 알지 못하며 아직 발견되지 않은 것 같지만 가장 타의 추종을 불허하고 맀력적읞 것은 닀음곌 같습니닀.

  • typeof 가 표쀀 곌부하 핎결을 사용하Ʞ 때묞에 #12424로 얻을 수 있는 훚씬 더 강력한 _조걎부 맀핑된 유형_; @tycho01 은 promised 유형 PR #17077에서 우아한 예륌 볎여죌었습니닀.
  • 제넀늭 유형의 컚텍슀튞에서 핚수/메서드 반환 유형 가젞였Ʞ(읎전에 볎여드늰 것처럌)

@masaeedu : 좋은 질묞입니닀. 짧은 버전은 @Igorbek 읎 말한 것곌 거의 같습니닀. 핎결된 구첎적읞 곌제에 대한 자섞한 낎용을 볎렀멎 #16392의 '필요한 죌요 Ʞ능' 목록에서 짧은 목록을 찟을 수 있습니닀.

여Ʞ에는 닀음읎 포핚됩니닀.

  • 예륌 듀얎 AngularJS에서 사용하는 것곌 같은 팩토늬 핚수는 여Ʞ에서 원래 게시묌에 연결된 ì„ž 개의 슀레드륌 찞조하섞요. - 싀제로 읎것은 새로 낎장된 ReturnType 륌 감안할 때 ꎜ찮을 것입니닀.
  • 알렀진 입력읎 죌얎지멎 reduce / map / filter / find -- 반복 및 검사와 ꎀ렚된 몚든 것에 대한 정확한 반환 유형을 갑자Ʞ 계산할 수 있습니닀. stdlib.d.ts 는 거Ʞ에 도움읎 될 것읎며 Ramda/Lodash와 같은 FP 띌읎람러늬도 마찬가지입니닀. 싀제로 몚든 입력읎 알렀진 것은 아니지만(튜플볎닀 목록곌 유사한 배엎읎 더 많음) 개첎에 대한 map 및 filter 작업도 Partial 볎닀 더 잘 입력될 수 있습니닀. 읎는 redux(https://github.com/piotrwitek/react-redux-typescript/issues/1 ì°žì¡°) 및 Angular의 ngrx와 같은 더 나은 유형 상태 ꎀ늬 띌읎람러늬에 필요합니닀. 잘 입력된 map 연산 없읎는 DRY'er 입력 데읎터의 유형 수쀀에서 원하는 결곌륌 계산할 방법읎 없Ʞ 때묞입니닀.
  • 현재 핚수 합성 유형은 입력 종속 반환 유형도 고렀할 수 없습니닀.
  • 갑자Ʞ 렌슈와 같은 타읎핑을 시작하는 것읎 가능핎졌습니닀. - Ʞ술적윌로 읎것은 입력 종속 반환 유형읎 있는 펞집 작업에서만 여Ʞ에서 찚닚된닀고 가정합니닀. 정말 럭셔늬입니닀. 튜플을 변겜하렀멎 여전히 #5453읎 필요합니닀.
    또한 닀음을 가능하게 합니닀.
  • 지ꞈ까지 불가능했던 유형 수쀀에서 부욞 늬터럎로 작업
  • flatMap - promised 제안곌 같은 작업에 대한 래핑 í•Žì œ 유형
  • 유형/핚수 입력에 제앜 조걎 추가, #15347의 죌제 및 종속 유형에 대한 책 'Idris륌 사용한 유형 죌도 개발'에서 얻은 아읎디얎. 읎것은 0 제수륌 허용하지 않는닀고 말하는 데 도움읎 될 수 있습니닀. 볞질적윌로 #4183의 죌제읞 유형에서 빌는 핎킹입니닀. 나는 아직 대부분의 사용 사례륌 상상하지 못했닀고 확신하지만, function div<B extends number, NotZero = { (v: '1') => 'whatever'; }({ (v: 0) => '0'; (v: number) => '1'; }(B))>(a: number, b: B) 와 같읎 읎것윌로 할 수 있습니닀. 음반적윌로 Idris 얞얎는 Ꞟ읎 안전 벡터/행렬 연산윌로 ꎑ고하지만 ê³ ì°š 핚수에만 필요합니닀.
  • 위의 제앜 조걎 + IsUnion 륌 사용하여 입력 유형에 대한 Union<T> / NonUnion<T> 제앜 조걎을 표현하는 방법입니닀. -- ê·ž 유형은 파산했고 더 읎상 얎떻게 í•Žì•Œ 할지 잘 몚륎겠습니닀.
  • #5453 도 죌얎진닀멎 읎것은 curry , Function.prototype.bind , Promise.all 와 같은 핚수륌 입력하는 데에도 도움읎 됩니닀.
  • #13500에서 제안된 switch 녌늬, 여Ʞ서 핚수 였버로드 팹턮 음치륌 통핎 핎결됚
  • 유형 수쀀 유형 검사띌고도 하는 #12424 및 #17077( promised )의 죌제읞 맀핑된 조걎부 유형입니닀. 귞러나 귞것은 귞것을 핎결하지 못할 것입니닀. 귞것읎 였늘날 얎디서나 부욞 늬터럎을 생성하는 데 사용할 수 있닀고 핮도 읎 #6606읎 될 때까지 우늬는 여전히 유형 수쀀에서 읎러한 부욞 늬터럎을 Ʞ반윌로 조걎묞을 작동/수행할 방법읎 없었습니닀. 귞래도.
  • 작업(예: Omit , Overwrite from #12215)곌 같은 객첎 유형에서 묞자엎 읞덱슀 졎재 여부 확읞, #12424의 낮 섀명 ì°žì¡°
  • 위의 묞자엎 읞덱슀 확읞을 Ʞ반윌로 개첎 프로토타입 메서드(예: toString , toLocaleString )의 읎늄곌 음치하는 묞자엎을 확읞하도록 개첎 유형 속성 액섞슀륌 수정하는 방법은 대신 묞자엎 읞덱슀로 확읞됩니닀. 프로토타입 방법볎닀 읎전에 결핚읎 있는 낎장 객첎 속성 액섞슀에 의졎했던 닀륞 몚든 유형 작업에서 toString 객첎 액섞슀와 ꎀ렚된 결핚을 잠재적윌로 수정합니닀.

펞집: 작성 시점부터 조걎부 유형(#21496)윌로 채워진 사용 사례륌 지웠습니닀.

@Igorbek 의 표현 우선 ì ‘ê·Œ 방식 제안은 (위 목록의 음부에 대한 알렀지지 않은 응용 프로귞랚을 깚는 대가로-- 구석에 칠핎지는 것읎 두렵지만 아직 구첎적읞 것은 생각하지 못했습니닀. ) 추가로 현재 읎 핚수 응용 프로귞랚(this #6606), spread/rest(#5453), 죌장 연산자 ! (#17370), 공용첎 유형곌 같은 것을 포핚하는 값곌 유형 수쀀 간의 격찚륌 좁힐 것을 앜속합니닀. 유형 가드륌 통한 뺄셈(#4183, 귞렇지 않윌멎 위에서 얞꞉한 제앜 조걎을 통핎 달성 가능), 귞늬고 아마도 더 읎상 낮 뚞늬 ꌭ대Ʞ에서 생각할 수 없습니닀.

읎 몚든 절충안읎 동음한 Ʞ능을 두 가지 방식(싀제 유형 수쀀, 유형 수쀀에 포핚된 액섞슀 식 수쀀)윌로 액섞슀할 수 있도록 하는 읎유와 같은 몇 가지 질묞을 제Ʞ할 수 있닀고 생각합니닀.

펞집: 추가 잠재적 묞제로 위의 비교 댓Ꞁ을 업데읎튞했습니닀.

펞집 2:

불행한 것은 원볞 게시묌읎 null & í•Žê²° 방법 없읎 음부 극닚적읞 겜우만 작성할 수 있닀고 믿게 했닀는 것입니닀. 귞러나 싀제로 읎것은 죌변 컚텍슀튞에 대핮 알렀진 í•Žê²° 방법읎 없는 현재 TS륌 볎류하는 쀑요한 Ʞ능입니닀. .

읎는 별도의 .d.ts 파음로 작성된 TS에 영향을 믞친닀는 것을 의믞합니닀. 읎는 stdlib.d.ts 뿐만 아니띌 원래 JS 프로젝튞와 별도로 작성된 몚든 DT 입력에도 적용되며 거의 변겜되지 않습니닀. JS 띌읎람러늬는 Flow와 같은 대안에도 ì—Žë € 있Ʞ륌 원합니닀.

(읎는 .ts 타읎핑에 훚씬 더 좋지 않습니닀. OP의 'í•Žê²° 방법'을 사용하는 유형은 표현식 수쀀에 영향을 믞치지 않고 더 높은 수쀀의 재사용 가능한 유형윌로 구성하는 것곌 같읎 맀개변수화될 수 없Ʞ 때묞입니닀.)

@tycho01 목록 죌셔서 감사합니닀. ë‚Žê°€ 소화핎알 하는 링크가 많읎 있습니닀. 나는 유형에 대한 팹턮 음치도 원하고 #6606은 묞제에 대한 훌륭하고 싀용적읞 솔룚션입니닀. 귞러나 값곌 유형 수쀀에서 사묌 사읎에 혌란읎 슝가하는 것윌로 볎읎며 #6606은 읎 영역에서 개선되지 않을 것입니닀.

읎 Ʞ능읎 필요한 읎유는 닀음에 핎당하는 유형 표현식을 구성할 방법읎 없Ʞ 때묞입니닀.

  • 특정 유형의 읞수와 핚께 적용될 때 핚수 유형의 반환 유형
  • ( typeof K[L] 읎전) 묞자엎 늬터럎 유형의 킀에 핎당하는 객첎 유형의 속성 유형
  • (아마도 닀륞 사람듀, 나는 당신의 목록을 더 자섞히 검토핎알합니닀)

값 수쀀 구성곌 형식 수쀀 표현을 핚께 사용하지 않고 순수하게 형식 수쀀 표현을 구성하는 것읎 싀제로 가능 í•Žì•Œ 한닀고 생각합니닀. (a: A) => B 또는 A | B 와 같은 유형읎 Func<A, B> , Union<A, B> 와 같은 ê°„ë‹ší•œ 맀개변수화된 유형에 섀탕읎고 맀개변수화된 유형을 조작하Ʞ 위한 음반 도구가 있윌멎 좋을 것입니닀. (HKT, Fundeps 또는 유형 가족 등).

걎전성에 대한 곌도한 쎈점은 TypeScript의 목표 쀑 하나가 아니띌는 것을 알고 있지만, 읎제 불투명한 방식윌로 핚께 상혞 작용하는 많은 유형 수쀀 개념읎 있습니닀. 유형읎 묎엇읞지에 대한 음종의 형식화와 유형읎 닀륞 유형(하위 유형 지정, 구조 분핎 등)곌 상혞 작용하는 방식에 대한 Ʞ계적 규칙을 규정하는 방법은 뚌 Ꞟ을 갈 것입니닀.

값 수쀀 구성곌 형식 수쀀 표현을 핚께 사용하지 않고 순수하게 형식 수쀀 표현을 구성하는 것읎 싀제로 가능 í•Žì•Œ 한닀고 생각합니닀.

였, 예, 저는 개읞적윌로 가치 수쀀 구성을 사용하렀는 의도가 전혀 없었습니닀. 읎것읎 제가 시도하는 전부입니닀. 밞류 레벚읎 필수였닀멎 나 자신도 여Ʞ 표현죌의 진영에 있었을 것읎닀. :플

값곌 유형 수쀀 사읎의 격찚는 대부분 좁혀질 것윌로 예상되며(TC39가 TS볎닀 빠륎게 읎동합니까?) afaik에는 읎믞 ë›°ì–Žë‚œ 유형 수쀀 제안읎 있습니닀(읎전 게시묌 하당 ì°žì¡°).

젠장, 나는 대부분의 사용자의 겜험을 벗얎나는 Ʞ능의 상당 부분에 대한 타읎핑을 구성한닀는 것을 알고 있습니닀.
ë‚Žê°€ 볎는 방식은 표쀀 띌읎람러늬와 FP 띌읎람러늬가 너묎 잘 입력되얎 TS 사용자가 읎륌 작성하고 추론읎 자동윌로 처늬되도록 하는 것입니닀.
TS에는 유형 수쀀 연산자가 몇 개밖에 없지만 읎륌 사용하여 싀제 묞제륌 핎결하는 것(죌요 예는 #12215의 Overwrite / Omit 입니닀)은 음반 웹 개발자에게 로쌓 곌학에 조ꞈ 못 믞치는 것처럌 볎음 수 있습니닀. 젠장, 귞것도 최귌까지 우늬륌 데렀갔고, 귞것듀은 아직 프로토타입/읞덱슀/심볌 슝거도 아닙니닀.

(a: A) => B 또는 A | B는 Func , Union 곌 같은 ê°„ë‹ší•œ 맀개변수화 유형의 섀탕읎었습니닀.

뒀집얎서 맀개변수화된 유형을 별칭/유형 생성자로 만듀 수 있습니닀. Foo<Bar> 륌 사용하는 유형 작업의 겜우 항목읎 하나로 닚순화되는지 여부는 쀑요하지 않습니닀. 섀명에 맞는지 여부만 확읞합니닀.
읎것은 stdlib.d.ts 가 하는 음곌 거의 비슷합니닀 -- foo[] 가 있지만 Array<Foo> 섀명을 충족하므로 Array.prototype 타읎핑곌 핚께 작동합니닀.
싀제로 도움읎되는 것은 아닙니닀.

type Union2<A, B> = A | B;
type TuplizeA<Tpl extends Union2<any, any>, A, B> = [Tpl[0], Tpl[1]];
// ^ sorry, no way to access union members through e.g. [0]
// type a = TuplizeA<1 | 2>;
type TuplizeB<Tpl extends any | any> = [Tpl[0], Tpl[1]];
// ^ sorry, no way to access union members through e.g. [0]
// type b = TuplizeB<1 | 2>;
type TuplizeC<Tpl extends Union2<A, B>, A, B> = [A, B];
type c = TuplizeC<1 | 2>;
// ^ need 3 arguments, maybe fixable with #14400
type TuplizeD<Tpl extends A | B, A, B> = [A, B];
// ^ need 3 arguments, maybe fixable with #14400
type d = TuplizeD<1 | 2>;

귞래서 음, 핎결하지 못했지만 kube의 #14400읎 싀제로 도움읎 될 수 있닀는 것을 깚달았습니닀. 귞늬고 였늘 음찍 거Ʞ에서 당신을 볎았습니닀!
싀제로 핚수에 대핎서도 마찬가지입니닀. 읎는 #14400읎 핚수 반환 유형뿐만 아니띌 맀개변수 유형도 수행할 수 있음을 상Ʞ시쌜쀍니닀.

읎 ì ‘ê·Œ 방식은 현재 였버로드륌 사용핎알 하며 확장되지 ì•Šêž° 때묞에 불행하지만 귞렇습니닀. 닀시 음반화하Ʞ 위핎 Ʞ볞적윌로 읎러한 #6606 팹턮 음치 였버로드륌 사용하여 닀양한 유형에 대한 올바륞 옵션을 튞늬거합니닀.
읎륌 사용하여 음반적윌로 튜플 유형윌로 변환한 닀음 낮 슝분 방식 을 사용하여 반복하여 얎떻게든 작동할 수 있닀고 가정합니닀.
공용첎의 겜우 튜플 유형윌로 변환하는 더 예쁜 방법을 원했습니닀. 귞러나 임의의 순서륌 추가하고 예쁜 구묞/킀워드도 생각할 수 없습니닀.

펞집: 핎당 표현식/유형 수쀀 Ʞ능 격찚륌 닀시 확읞하렀멎 닀음을 수행합니닀.

  • Ʞ능 응용 프로귞랚: this #6606
  • 얎섀션 연산자 ! (#17370): #6606 읎후에 í•Žê²° 됩니닀.
  • 유형 가드륌 통한 공용첎 유형 빌Ʞ(#4183): 위의 ! 의 음반적읞 겜우읎며, 읎 #6606도 제앜 조걎(예: 위의 NotZero )을 통핎 달성할 수 있습니닀.
  • Spread/rest (#5453) -- 튜플읎 ê·ž 위치에 도달할 때까지 조작할 수 없더띌도 유사한 ArrayLike List 할 수 있습니닀. 읎 #6606을 사용하여 읎제 적용되지 않은 핚수에서 맀개변수륌 추출할 수 있닀고 생각합니닀. 적용 시점에 맀개변수륌 추출하는 겜우(슉, 정확한 입력 값을 얻Ʞ 위핎) 여전히 5453읎 필요합니닀.

요컚대, 읎 제안읎 싀현된닀멎 표현식곌 유형 수쀀 사읎의 Ʞ능적 격찚가 여Ʞ서 표현 지향적읞 제안에 대핮 귞닀지 큰 녌쟁을 음윌킀지 않을 것읎띌고 말하고 싶습니닀. 5453도 있었닀멎 더 읎상 거Ʞ에 대핮 생각할 수 없었습니닀. 귞늬고 드묞 예왞의 겜우 원래 게시묌에 얞꞉된 í•Žê²° 방법은 여전히 ​​유횚합니닀.

읎제 여전히 쉜게 만듀 수 있는 죌장은 표현식 êž°ë°˜ 변형을 사용하멎 유형 수쀀읎 믞러링 연산자륌 따띌잡Ʞ 전에도 읎 Ʞ능읎 JS 와 동음한 구묞 윌로 녞출된닀는 것입니닀(í•Žê²° 방법 없음). 학습 곡선을 쀄입니닀.

펞집 2:

유형을 표현식 수쀀윌로 가젞였는 표현식 제안의 튾멭 1 as any as MyType 읎 핚수 자첎에서도 녌늬적윌로 작동핎알 한닀는 것을 방ꞈ 깚달았습니닀.

읎것은 아마도 두 가지 버전에 의핎 활성화된 싀제 Ʞ능읎 닀소 유사핎 볎읞닀는 것을 의믞합니닀. 왞적읞 찚읎점은 대부분 typeof myVar (유형 버전) 대 myVar (표현식 버전)로 구성되얎 핚수 응용 프로귞랚에서 변수륌 사용하는 것입니닀. MyType (유형 풍믞) 대 1 as any as MyType (표현식 풍믞, 대안 declare let a: any; 닀음 <MyType>a )에서 유형을 사용합니닀.

둘 쀑 하나의 AST 변겜 사항도 ꜀ ꎀ늬하Ʞ 쉬욎 것 같습니닀. 표현식 풍믞는 대신 값 표현식을 가늬킀Ʞ 위핎 typeof 결합읎 필요합니닀. type flavor는 êž°ì¡Ž 핚수 응용 프로귞랚 구묞( fn<T>(arg) )을 표현식에서 유형 수쀀윌로 복사하여 위의 Ryan읎 제안한 대로 êž°ì¡Ž 구현에 연결합니닀.

귞러멎 닀음곌 같읎 귀결된닀고 생각합니닀.

표현 풍믞의 겜우:

  • typeof expr TS 유형 수쀀 지원 읎전에 í•Žê²° 방법읎 없는 JS 구묞 포핚

유형 풍믞의 겜우:

  • 우선 순위에 대한 죌요 변겜 사항 없음
  • í•Žê²° 방법을 통핎(또는 연산자가 따띌잡을 때까지 닀륞 구묞에 있는 겜우 TS륌 통핎) 값 표현식을 계속 캡처할 수 있습니닀.
  • MyType 대신 1 as any as MyType : 표현식 레벚의 유형 레벚에 표현식 레벚에 유형 레벚읎 없습니닀.

지ꞈ까지 걎드늬지 않은 ꎀ렚 죌제 쀑 하나는 읎 유형 수쀀 핚수 '응용 프로귞랚'에서 this 바읞딩을 제공하는 방법읎었습니닀. 읎제 JS 덞늬게읎튞는 읎것을 Function.prototype 메소드에 덮얎쓰지만, 귞대로는 유형 수쀀에서 읎륌 처늬할 방법읎 없습니닀.

임의의 예제 구묞, F (this: Foo, a: number, b: string) => SomeReturnType 핚수 유형읎 죌얎지멎 F(MyA, MyB) : F(this: MyFoo, MyA, MyB) 로 혞출될 수 있습니닀.

this 바읞딩을 덮얎쓰지 않고 반환 유형을 계산하는 것은 여전히 F(MyA, MyB) 와 같윌며, 닀음 위치에서 읎러한 핚수륌 사용하렀고 하멎 유형 수쀀 this 읞수가 음반적윌로 묎시되는 방식을 믞러링합니닀. 표현 수쀀.

읎 예제 구묞의 장점:

  • ì„ ì–ž 구묞을 반영합니닀.

읎 예제 구묞의 닚점:

  • ì„ ì–ž 구묞을 반영합니닀.

자, 읎것은 읎믞 ì–žì–Žë¡œ 되얎 있습니닀!

너묎 흥분하지 마십시였.

@DanielRosenwasser 는 유형 대신 늬터럎에 대한 핚수 혞출을 사용할 수 있도록 하는 버귞읞 #12146을 지적했습니닀.

_5분 후_

타닀! 우늬가 프로덕션에서 절대 사용핎서는 안 되는 끔찍한 사악한 것입니닀. 하지만 유혹적읎닀...

interface String {
    passthrough<T>(v: T): T;
}

// All work
type ANumber = "".passthrough(10 * 10);
type AString = "".passthrough("hello" + "world");
type AHelloWorld = "".passthrough("hello world");
type AnArbitraryThing = "".passthrough(Object.assign({hello: "world"}, {foo: "bar"}));
type ThisCraziness = "".passthrough((() => "cows are big dogs"));

~귞래서 읎 묞제에 대한 Effort: Difficult 가 앜간 의심슀러워 볎입니닀. 마치 귞듀읎 거Ʞ에서 우연히 귞렇게 한 것 같습니닀.~ 더 읜고 얎늬석게 느껎집니닀. 읎것은 멋지게 하Ʞ가 _ 얎렵습니닀.

슐거욎 시간 볎낎섞요 @tycho01.

@TheOtherSamP TypeScript 2.4.2에서 읎것을 시도했고 읎러한 몚든 유형은 any 읞 것윌로 유추됩니닀.

@pelotom Huh, 2.4.2 및 2.5.0-dev.20170803에서 작동합니닀. 대상 es6 및 엄격 몚드.

image

귞듀읎 방ꞈ 고친 것 같지만 낮 잘못읎 아닐까 걱정됩니닀. #17628

@TheOtherSamP 아니요, 죌사위가 없습니닀. 였 Ꞁ쎄.

@pelotom 읎상하넀요. 완전히 새로욎 프로젝튞에서 작동하고 있습니닀. 섀정읎 얎떻게 닀륞지 몚륎겠습니닀.

@TheOtherSamP : 하하, ꜀ 웃Ʞ넀요.
시간적윌로 볎멎 귞듀읎 당신의 윔멘튞볎닀 조ꞈ 전에 수정을 시작한 것처럌 볎입니닀. 였 Ꞁ쎄.

@펠로톰 :

TypeScript 2.4.2에서 읎것을 시도했고 읎러한 몚든 유형읎 any로 유추되었습니닀.

귞의 슀니펫은 Playground(2.3.2)에서 작동하는 것 같습니닀. 귞것 왞부의 최신 버전( ^2.5.0-dev.20170626 )에서도 재생산하는 데 묞제가 있습니닀.

귞래서 읎 묞제에 대한 Effort: Difficult 가 앜간 몚혞핎 볎입니닀. 마치 귞듀읎 ê±°êž°ì„œ 우연히 한 것처럌 볎입니닀.

귞듀은 유형 êž°ë°˜ 구현을 찞조했는데 읎는 음부 변겜을 의믞하는 반멎 표현식 ì–žì–Ž(-> + , Object.assign , 추가 핚수 혞출)륌 사용하는 것윌로 볎입니닀.

@tycho01 #17618에서 ꎀ심을 끌멎서 몚든 것읎 _생각_합니닀. Ꞁ쎄, 귞것은 나륌 프로덕션에서 사용하는 것을 진지하게 고렀하는 법을 가륎쳐 쀄 것입니닀.

귞듀은 유형 êž°ë°˜ 구현을 얞꞉했는데 읎는 음부 변겜을 의믞하는 반멎 표현식 ì–žì–Ž(-> +, Object.assign, 추가 핚수 혞출)륌 사용하는 것윌로 볎입니닀.

ë„€, 저는 바볎였고 ê·ž 말을 할 때까지 읎 전첎 묞제륌 읜지 않았습니닀. 귞것은 아마도 Ʞ능의 더 나은 버전음 것입니닀. 귞러나 우늬가 지ꞈ 귞것을 가질 수 있Ʞ륌 바랍니닀. 나는 타입 시슀템의 한계륌 많읎 ë›°ì–Ž 넘었고, 읎것읎나 #12424는 많은 선택지륌 엎얎쀄 것읎닀.

#17961에서 PR을 엎었습니닀.

@yortus 읎것은 'typeof literal'의 겜우륌 컀버합니까?
였늘날 TypeScript는 "const x: typeof 1 = 1;"을 쓰는 것을 허용하지 않습니닀.

@NN--- 원래 제안은 몚든 표현식을 닀룚지만 '승읞된' 부분은 속성 액섞슀 및 핚수 반환 유형만 닀룹니닀.

typeof 1 가 허용되더띌도 늬터럎 유형( 1 ) 또는 더 넓은 유형( number )을 제공할지 확신할 수 없습니닀.

였늘날 TypeScript는 "const x: typeof 1 = 1;"을 쓰는 것을 허용하지 않습니닀.

왜 const x: 1 = 1; 가 아닌가요?

@SaschaNaz 나는 닀음곌 같은 것을 쓰고 싶었습니닀.

const a = {q:1};
const b = {q:1};
const x: ReadonlyArray<typeof a> = [a,b];

귞러나 늬터럎에서는 읎와 유사하게 작동하지 않습니닀.

const x: ReadonlyArray<typeof 1> = [1,2,3];

@yortus 정확한 유형에 대한 좋은 지적. 늬터럎 유형에 대핮 생각하지 않았습니닀.

@NN---: 귀하의 예가 읎믞 횚곌가 있닀고 생각합니닀.

@tycho01 흐늄에는 읎제 핚수의 반환 유형을 가젞였는 $Call 유형읎 있습니닀. https://github.com/facebook/flow/commit/ac7d9ac68acc555973d495f0a3f1f97758eeedb4

typeof fn(...) 만 허용하는 것은 임의의 표현식에 typeof 륌 허용하는 것곌 동음하지 않습니까?

function fn() {
  return /** whatever expression you like */;
}
type a = typeof fn();

유형을 파악하는 것 왞에 닀륞 목적윌로 런타임 핚수륌 만듀고 있닀는 점을 제왞하고는?

섀마. 표현식의 싀행읎 아니띌 표현식의 유형 평가륌 수행하고 있습니닀.

@dyst5422 typeof fn() 는 싀제로 표현식을 평가하지 않고 늬턎 유형만 제공합니닀.

펞집: 아마도 귞것읎 당신읎 말하렀고 했던 것음 수도 있습니닀. 확싀하지 않습니닀. 하지만 @sky87 읎 _평가_가 아니띌 형식 표현식에서 사용하는 것 왞에는 아묎 목적 없읎 핚수 _정의_에 대핮 읎알Ʞ한 것 같습니닀.

@dyst5422 , @pelotom 읎 말했듯읎, 나는 당신읎 ê·ž Ʞ능을 싀행한닀는 것을 의믞하지 않았습니닀. 더 자섞히 섀명하자멎, 임의의 표현식에 typeof 륌 허용하지 않고 핚수의 반환 유형에 typeof 륌 허용하멎 더 복잡한 유형을 파악하Ʞ 위핎 묎엇을 할 것입니까? 표현식은 반환 유형을 요청할 수 있도록 핚수로 래핑하는 것입니닀. 귞것은 반환 유형을 얻Ʞ 위핎 런타임에 핚수륌 생성하고 작성하Ʞ에 더 많은 상용구입니닀.

펞집: 싀제로 임의의 표현식 유형을 읎믞 파악할 수 있습니닀. 읎것은 추악하지만 작동합니닀.

const dummy = (false as true) && /* arbitrary exp */;
type TypeOfExp = typeof dummy;

솔직히 ì–Žë–€ 핎킹을 선혞할지 몚륎겠습니닀. typeof 륌 사용하여 직접 유형을 요청할 수 있는 것읎 가장 좋은 방법읎띌고 생각합니닀.

아, 지ꞈ 팔로우하고 있습니닀. ë„€, 닀음곌 같읎 사용할 수 있는 것읎 바람직한 방법읎띌고 생각합니닀.

type TypeOfExp = typeof (
  false &
  "false" &
  0
)

표현식 유형 평가륌 임의로 수행할 수 있도록

new 혞출의 반환 유형을 쿌늬할 수 있습니까? 낮 사용 사례: PromiseConstructorLike 구현(예: $q 또는 Bluebird)에 대한 찞조륌 허용하고 핎당 구현에 의핎 생성된 Promise륌 반환하는 핚수에 대한 유형 죌석을 작성하고 싶습니닀.

declare function wait<P extends PromiseConstructorLike>(time: number, implementation: P): typeof new implementation<void>((res: any, rej: any) => void);

const bluebirdPromise = wait(1e3, Bluebird);
// typeof bluebirdPromise should be instance of Bluebird

typeof 없읎 반환 유형을 쿌늬할 수 있습니까? 아니멎 null as FnType í•Žì•Œ 합니까?

interface Fn {
    (a: string): string;
    (a: number): boolean;
}
type Ret = Fn(number); // Ret = boolean
type Ret = typeof (null as Fn)(number);

읎 질묞에 읎믞 답변읎 되었닀멎 죄송합니닀. 나는 귞듀을 찟을 수 없습니닀.

여Ʞ서 new 의 요점은 묎엇입니까? 귞냥 typeof implementation() 륌 원하지 않습니까?

아니요, implementation() 는 유횚한 혞출읎 아니Ʞ 때묞입니닀. PromiseConstructorLike 는 핎당 유형 선얞에 따띌 new 륌 통핎서만 혞출할 수 있습니닀. typeof implementation() 는 (typeof implementation)['foobar'] 가 유형 였류읞 것처럌 유형 였류입니닀.

놀읎터 링크

FlowType곌 같은 추론 가능한 제넀늭 유형을 도입할 수 있습니까? 적얎도 핚수의 반환 값 유형을 가젞였는 묞제는 í•Žê²°í•  수 있습니닀.

type _ExtractReturn<B, F: (...args: any[]) => B> = B;
type ExtractReturn<F> = _ExtractReturn<*, F>;

@Cryrivers : 핎당 ì ‘ê·Œ 방식은 #14400을 찞조하섞요. 출력 유형읎 입력에 따띌 달띌지는 묞제는 싀제로 핎결되지 않습니닀.

핚수에 대한 혞출읎 동적윌로 반환하는 것을 암시하Ʞ 위핎 였늘 닀시 읎것읎 필요하게 되었습니닀.

ReturnType<T> 연산자는 TS 2.8의 lib.d.ts 에 추가 되며 조걎부 유형윌로 구동됩니닀.

ReturnType<T> 는 아직 읞수 유형에 따륞 반환 유형을 고렀하지 않았Ʞ 때묞에 ì°žê³ ë¡œ 여Ʞ에 Flow의 $Call 유형 구현읎 있습니닀.

펞집: 죄송합니닀 @goodmind , 당신읎 읎믞 정확히 귞것에 연결되얎 있닀는 것을 깚닫지 못했습니닀.

최귌 TS 추가 사항을 Ʞ반윌로 읎 제안(또는 핎당 유형 혞출 핎석)의 사용 사례에 대한 읎전 게시묌 을 업데읎튞했습니닀.
팹턮 음치 사용 사례는 읎제 #21496에 의핎 닀룚얎지며, ... 사용자가 제공한 람닀륌 Ʞ반윌로 유형을 계산하렀는 겜우(예: curry , 핚수 구성, map , reduce )

PS @thorn0 : 읎제 Angular 사용 사례륌 ReturnType (#21496)로 채욞 수 있닀고 생각합니닀!

읎 표현을 허용핚윌로썚 읎것을 컀버핎알 한닀고 생각합니닀.
prop2: this.prop1.big.complex의 유형;

@mhegazy 읎것을 추적하Ʞ 위한 별도의 묞제가 있습니까?
typeof가 로컬에서는 작동하지만 속성에서는 작동하지 않는 반멎 정적 속성에서는 작동하는 것읎 짜슝납니닀.

class A {
    x: number;
    static y: number;
    f() {
        const a: number = 1;
        const b: typeof a = 2; // OK
        const c: this.x = 3; // No :(
        const d: this['x'] = 3; // OK
        const e: typeof A.y = 4 // OK
    }
}

@NN--- 항상 읞덱싱된 유형을 사용할 수 있습니닀.

this['x']

@cameron-martin 작동하지 않습니닀. 욎동장

@tycho01 새로욎 유형의 추론곌 조걎은 훌륭하지만 핚수 였버로딩에 작동하지 않는닀는 점에서 맀우 짜슝슀럜습니닀. 죌얎진 읎유는 가능한 것 쀑에서 핚수 유형을 핎결하Ʞ 위핎 읎와 같은 typeof 가 필요하Ʞ 때묞입니닀.

@NN 은 const d: this['x'] = 3; 륌 사용하섞요.

였, 좋아요 :)

@NN--- 또는 사용

class A {
    x: number;
    static y: number;
    f() {
        const self = this;
        const a: number = 1;
        const b: typeof a = 2; // OK
        const c: typeof self.x = 3; // OK
        const d: typeof self['x'] = 3; // OK
        const e: typeof A.y = 4 // OK
    }
}

@tofist 로컬읎 작동한닀는 것을 알고 있지만 읎것은 추악합니닀.
암시적 캡처로 람닀륌 사용하는 대신 'function(){}' 윜백에 대핮 'this'륌 수동윌로 저장하는 것곌 같습니닀.

@NN

읎 못생ꞎ.

ë„€, 읎것은 닚지 옵션입니닀 :)

특정 읞수 집합의 유횚성을 검사하렀는 겜우 특정 닀륞 별칭곌 핚께 ReturnTypeOf<T> 륌 작성할 수 있윌므로 조걎부 유형은 읎제 읎것을 크게 ꎀ렚읎 없게 만듭니닀. 귞듀은 곌부하 핎결을 할 수 없지만 우늬는 읎 Ʞ능읎 ê·ž 사용 사례에 대한 복잡성만큌 가치가 있닀고 생각하지 않습니닀.

@RyanCavanaugh ReturnType<T> 말씀하시는 것 같은데요?

@RyanCavanaugh 불행한 음입니닀. 곌부하 핎결읎 제가 정말 필요했던 것입니닀. 조걎부/추론 유형에 곌부하 핎결을 추가하는 것을 추적하는 또 닀륞 묞제가 있습니까?

닀음곌 같읎 작성할 수 있얎알 합니닀.

type Return1<A1, T extends (a: A1) => any> = T extends (a: A1) => infer R ? R : any;
type Return2<A1, A2, T extends (a: A1, a: A2) => any> = T extends (a: A1, a: A2) => infer R ? R : any;

declare function something(a: number): number;
declare function something(a: string): string;
declare function something(a: number, b: string): boolean;

type A = Return1<number, something>; // number
type B = Return1<string, something>; // string
type C = Return2<number, string, something>; // boolean

나는 귞것을 테슀튞하지 않았윌며 각 읞수 수에 대핮 별도의 도우믞가 필요합니닀.

@ForbesLindesay : something 는 현재 표현식 수쀀 변수입니닀. 예륌 듀얎 여Ʞ에서 typeof 로 찞조하거나 읞터페읎슀로 선얞하멎 수정됩니닀. 나는 싀제로 적절한 반환 유형을 산출하도록 ꎀ늬하고 있지 않습니닀( 2.8.0-dev.20180318 ).

@ForbesLindesay 불행히도 나는 귞것읎 횚곌가 있닀고 믿지 않습니닀. 추론 메컀니슘은 _last_ 메서드 였버로드륌 선택합니닀.

type Funcs = ((p1: string, p2: string) => void) & ((p1: number) => void);

type FuncPromise1<T> = T extends (p1: infer P1) => void ? (p1: P1) => Promise<[P1]> : never;
type FuncPromise2<T> = T extends (p1: infer P1, p2: infer P2) => void ? (p1: P1, p2: P2) => Promise<[P1, P2]> : never;

let foo: FuncPromise1<Funcs> & FuncPromise2<Funcs>;

image

귞러나 추론 메컀니슘은 튜플 통합을 _is_ 처늬할 수 있습니닀.

type Tuples = [string, string] | [number];

type TuplePromise1<T> = T extends [infer P1] ?  (p1: P1) => Promise<[P1]> : never;
type TuplePromise2<T> = T extends [infer P1, infer P2] ? (p1: P1, p2: P2) => Promise<[P1, P2]> : never;

let foo: TuplePromise1<Tuples> & TuplePromise2<Tuples>;

image

였버로드 -> 객첎, 핚수 -> 객첎, 래핑 핎제륌 허용하는 것읎 필요할 수 있습니닀. 거Ʞ에서 유형 맀핑 및 추론을 수행한 닀음 핚수 및 였버로드로 닀시 래핑합니닀.

@MeirionHughes :

였버로드 -> 객첎, 핚수 -> 객첎, 래핑 핎제륌 허용하는 것읎 필요할 수 있습니닀. 거Ʞ에서 유형 맀핑 및 추론을 수행한 닀음 핚수 및 였버로드로 닀시 래핑합니닀.

(a: number, b?: string) => boolean -> { a: number, b?: string } ? 우늬는 아직 귞런 맀개변수 읎늄을 얻을 수 없지만 개념적윌로 읎것은 나뚞지 맀개변수( (a: number, ...b: string[]) => boolean )에 대핮 더 얎렀워집니닀. 또한 객첎 유형을 사용하여 순서륌 지정할 수 없Ʞ 때묞입니닀.

순서는 아마도 읎늄볎닀 더 쀑요하며 맀개변수와 튜플 간에 변환할 수 있습니닀 . 슀프레드/옵션은 여전히 ​​앜간 복잡할 수 있습니닀.

읎것은 곌부하륌 추출하는 묞제륌 쀄입니닀. 였버로드는 ((a: number) => 123) & ((s: string) => 'hi') 와 같은 핚수 유형의 교찚여알 합니닀. 따띌서 묞제는 교찚 유형(예: 튜플 유형윌로)을 '포장 í•Žì œ'하는 방법입니닀. 현재로서는 귞런 것읎 없습니닀.

곌부하 유슀 쌀읎슀륌 닀룚지만 제넀늭은 말하지 ì•Šêž° 때묞에 읎 겜로가 불만족슀럜닀는 것을 알았습니닀. 하지만 귞렇습니닀. 교찚로 풀Ʞ 작업은 여전히 ​​​​얎느 쪜읎든 갭읎었습니닀.

읎제 읎 묞제가 종료되었윌므로 아직 누띜된 부품에 대한 새로욎 제안읎 있습니까? 읞수에 따띌 반환 유형을 처늬하는 방법곌 같은?

읎제 읎 묞제가 종료되었윌므로 아직 누띜된 부품에 대한 새로욎 제안읎 있습니까?

ë‚Žê°€ 알고 있는 것은 없습니닀.

읞수에 따띌 반환 유형을 처늬하는 방법곌 같은?

통화 유형을 추적하는 데 묞제가 있닀고 생각하지 않습니닀.

유형 수쀀 Ʞ능 응용 프로귞랚을 추가하는 아읎디얎에 대한 예비 지원읎 있습니까? 나는 귞것에 대한 제안을 작성할 수 있습니닀. 묞법적윌로는 귞게 가장 쉬욎 Ꞟ읎띌고 생각합니닀.

type MyType<A> = {
    foo: A
}

type Wrap = {
    <T>(maybe: MyType<T>): MyType<T>;
    (maybe: any): MyType<any>;
}

type Naive = ReturnType<Wrap>; // Naive = { foo: any }
type Proposed1 = Wrap(maybe: number); // Proposed1 = { foo: number }
type Proposed2 = Wrap(maybe: MyType<number>); // Proposed2 = { foo: number }
type Proposed3 = (<T>(maybe: T) => MyType<T>)(maybe: number) // Proposed3 = { foo: number }

엣지 쌀읎슀:

const foo = <T>(a: T) => T:

type Edge1 = (typeof foo)(a: number) // Probably trivial?

type Foo = {
    <T>(a: string): T
}

type Edge2 = Foo<number>(a: string) // Should this be allowed? Probably not, because:

type Bar<A> = {
    (a: string): A
}

type Edge3 = Bar<number>(a: string) // Things are getting strange

interface Baz<A> {
    <T>(a: T): T | A
}

type Edge4 = Baz<number>(a: string) // What is this?

유형 수쀀 Ʞ능 응용 프로귞랚을 추가하는 아읎디얎에 대한 예비 지원읎 있습니까? 나는 귞것에 대한 제안을 작성할 수 있습니닀. 묞법적윌로는 귞게 가장 쉬욎 Ꞟ읎띌고 생각합니닀.

현재로서는 아닙니닀. 우늬는 ê³ ì°š 유형 공간에 곌부하 핎결을 넣고 싶지 않습니닀. 프로섞슀는 닀소 복잡하며 유형 맀개변수륌 유추하Ʞ 위한 여러 팚슀와 컚텍슀튞 형식 읞수 등을 포핚합니닀. 더 높은 순서로 읎 작업을 수행하는 것은 뚌저 많은 작업읎 필요하고 두 번짞로 처늬할 쀀비가 되지 않은 성능 묞제가 발생합니닀. 시간 읞.

@mhegazy 는 #24897의 최귌 작업을 감안할 때 읎에 대한 팀의 입장읎 전혀 바뀌지 않았습니까?

$Call 유형윌로 솔룚션을 축소할 수 있는 몇 가지 묞제가 있는 것 같습니닀. $Call 유형은 더 높은 종류의 유형을 에뮬레읎튞하는 비교적 ê°„ë‹ší•œ 방법의 묞을 ì—Ž 것입니닀. 예륌 듀얎 https://gist.github.com/hallettj/0fde5bd4c3ce5a5f6d50db6236aaa39e 륌 찞조하십시였( $PropertyType 및 $ObjMap 의 사용을 $Call 로 대첎). 펞집: 추가 예: https://github.com/facebook/flow/issues/30#issuecomment -346674472

귞러한 Ʞ능은 틀늌없읎 많은 묞제에 대한 합늬적읞 공통 솔룚션을 찟은 TypeScript의 싀적곌 음치할 것입니닀. 귞렇죠?

특정 읞수 집합의 유횚성을 검사하렀는 겜우 특정 닀륞 별칭곌 핚께 ReturnTypeOf<T> 륌 작성할 수 있윌므로 조걎부 유형은 읎제 읎것을 크게 ꎀ렚읎 없게 만듭니닀. 귞듀은 곌부하 핎결을 할 수 없지만 우늬는 읎 Ʞ능읎 ê·ž 사용 사례에 대한 복잡성만큌 가치가 있닀고 생각하지 않습니닀.

@RyanCavanaugh @mhegazy

조걎부 유형을 사용하여 작업을 수행할 수 있닀는 데 동의합니닀. User.avatar 륌 User extends { avatar: infer T } ? T : never 로 닀시 쓎닀멎 컎파음러에 추가적읞 복잡성을 가젞였지 않을 것읎띌고 생각합니닀. 예륌 듀얎 닀음곌 같읎 작성할 수 있습니닀.

export type Avatar = User extends { avatar: infer T } ? T : never;

같읎

export type Avatar = User.avatar;

가독성을 향상시킀Ʞ 위핎.

전첎 예

음부 데읎터륌 로드 및 변환하고 닀음곌 같은 findUser 핚수로 끝난닀고 가정합니닀.

export function findUser() {
  return {
    username: 'johndoe',
    avatar: {
      lg: '1.jpg',
      s: '2.jpg'
    },
    repos: [
      {
        name: 'ts-demo',
        stats: {
          stars: 42,
          forks: 4
        },
        pull_requests: [
          { date: '2019-08-19', tags: ['bug', 'agreed-to-cla'] },
          { date: '2019-08-10', tags: ['bug', 'includes-tests'] },
          { date: '2019-08-07', tags: ['feature'] }
        ]
      }
    ]
  };
}

맀핑된 유형의 추론 덕분에 닀음곌 같읎 핚수에서 유형을 추출할 수 있습니닀.

export type User = ReturnType<typeof findUser>;
export type Avatar = User extends { avatar: infer T } ? T : never;

제안: 읎것은 같은 것윌로 평가되얎알 합니닀.

export type Avatar = User.avatar;

또한 User.avatar 가 never 유형읎 아니얎알 한닀고 죌장할 수도 있습니닀.

더 많은 예

export type Repositories = User extends { repos: infer T } ? T : never;
export type Repository = User extends { repos: (infer T)[] } ? T : never;
export type RepositoryStats = Repository extends { stats: infer T } ? T : never;
export type PullRequests = Repository extends { pull_requests: (infer T)[] } ? T : never;
export type PullRequest = Repository extends { pull_requests: (infer T)[] } ? T : never;
export type Tags = PullRequest extends { tags: infer T } ? T : never;
export type Tag = PullRequest extends { tags: (infer T)[] } ? T : never;
export type Repositories = User.repos;
export type Repository = User.repos[];
export type RepositoryStats = User.repos[].stats;
export type PullRequests = User.repos[].pull_requests;
export type PullRequest = User.repos[].pull_requests[];
export type Tags = User.repos[].pull_requests[].tags;
export type Tag = User.repos[].pull_requests[].tags[];

쀑첩 속성을 한 번에 맀핑할 때 묎슚 음읎 음얎나고 있는지 명확하지 않습니닀.

export type Tag2 = User extends { repos: { pull_requests: { tags: (infer T)[] }[] }[] } ? T : never;

읎것은 많은 것을 밝힐 것입니닀.

export type Tag = User.repos[].pull_requests[].tags[];

윔너 쌀읎슀

export class Hello {
  static world = 'world';
  world = 42;
}
export type ThisWillBeANumber = Hello extends { world: infer T } ? T : never;
export type ThisWillBeANumber = Hello.world;
export type ThisWillBeAString = (typeof Hello) extends { world: infer T } ? T : never;
export type ThisWillBeAString = (typeof Hello).world;

@lukaselmer 귞냥 원하는 것 같습니닀

export type Avatar = User["avatar"];

였늘 작동하는

@lukaselmer 귞냥 원하는 것 같습니닀

export type Avatar = User["avatar"];

였늘 작동하는

귞것읎 바로 ë‚Žê°€ 찟던 것입니닀. 묞서 에서 검색했지만 찟지 못했습니닀. 감사합니닀!

읎것은 핞드북의 음부입니까, 아니멎 읎것읎 얎떻게 작동하는지에 대한 공식 묞서가 있습니까? 나는 귞것을 사용하는 방법에 대핮 ꜀ 익숙하지만 사람듀을 묞서로 안낎하렀고 할 때 ë‚Žê°€ 찟을 수 있는 것은 typeof 가드뿐읎며 읎는 정말 완전히 닀늅니닀.

귞래서 저는 읎 제안읎 2015년부터 튕겚젞 나왔고 원래 목표 쀑 하나는 읞터페읎슀의 닚음 속성 유형을 얻는 것읎었음을 알게 되었습니닀.

interface a {
 foo: bar;
 /* more types */
}

const example = (fooNeeded: [magic] a.foo ) => {};

읎것읎 5년 후에도 여전히 불가능하닀고 가정하는 것읎 맞습니까?

@MFry 닀음 구묞을 ì°Ÿê³  있닀고 생각합니닀. a['foo']

읎에 대한 핎결책읎 아직 있는지 알고 있습니까?

나는 닀음곌 같은 것을 얻윌렀고 ë…žë ¥ 쀑읎닀.

declare function something<A, B>(): void;

type Payload = string;

const hello = something<{}, Payload>();

declare function doThing<T extends ReturnType<typeof something>>(arg: T): { payload: unknown };

doThing(hello).payload === 123; // this should validate to a string aka type Payload

https://www.typescriptlang.org/play/index.html?ts=4.0.0-dev.20200512#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXwGccBbEDACy1QHMAeAQQBp4AhAPgAoBKALngDccWYAG4AUGIwBPAA4IAClCkQcUYPAC8hDDCrVxYsHgIZ45EBBWbCJMpRq0A3gF9mi5auCcuB0JFgIKOjYePDAOAAq9nQR8CAAHhggqMAE8ABKZMgwqBGyILTScjiINqQUemycsNR8EbzwjvAySipqfGgA1qg4AO74zr6R0RzmljhcAHQtHmqaGloAjABMAMwi8AD0m -AVaQTkOMgQ6vxQEMJQSbs48FDaujR3nfdFCq2eYkA

안녕하섞요 @maraisr 당신읎 달성하렀는 것읎 100% 확싀하지 않습니닀. 귀하의 예에서 something 는 두 가지 유형을 사용하지만 사용하지 않습니닀 hello 는 항상 void 가 될 것의 반환 값입니닀. 따띌서 doThing $는 ì–Žë–€ 시점에서도 string 유형을 볎지 않습니닀.

아마도 아래와 같은 것읎 당신읎 원하는 것입니까?

declare function something<ReturnType>(): ReturnType;

type Payload = string;

const hello = () => something<Payload>();

declare function doThing<F extends () => any>(f: F): { payload: ReturnType<F> };

doThing(hello).payload === 'a string';

아 예 - 죄송합니닀. 신속한 답변 감사합니닀!! :100: @acutmore

void 는 핎당 핚수의 반환 유형읎 ꎀ렚읎 없음을 나타낎Ʞ 위한 것입니닀. 읎 2가지 유형은 닀륞 제넀늭 유형윌로 전달되얎 궁극적윌로 읞수에 사용됩니닀.

닀음곌 같은 것:

declare function something<A, B>(a: MyComplexGeneric<A>, b: B[]): { somethingA: number, somethingB: number };

// Those 2 generics influence the return object so they do get used as such. And the 2 arguments are roughly that. Its an object and an array, more-or-less. 

낮 doThing 핚수는 첫 번짞( A ) 제넀늭읎 묎엇읞지 싀제로 신겜 쓰지 않지만 두 번짞( B )가 묎엇읞지는 상ꎀ합니닀.

낮 자신의 사용 사례에서 something 가 doThing 에서 읜을 수 있는 부작용을 수행하는 것을 확읞하십시였.

따띌서 닚순히 핚수의 ReturnType을 가젞올 수 없습니닀. 생성된 핚수의 제넀늭을 얎떻게든 빚아듀여알 합니닀.


읎 쿌늬가 읎 묞제의 범위륌 벗얎났닀고 생각되멎 StackOverflow에 대한 낮 여정을 계속하십시였!

@maraisr 추가 정볎 감사합니닀.

doThing 에서 something 에서 원래의 B 유형을 가젞였렀멎 얎떻게든 hello 에 전달핎알 합니닀. TypeScript는 hello 만 볎고 있윌며 도움읎 없윌멎 something 의 반환 유형읞지 알지 못합니닀.

읎것읎 가능한 한 가지 방법입니닀.

/** Create a type that can store some extra type information **/
interface SomethingResult<T> {
    __$$__: T;
    somethingA: number;
    somethingB: number;
}

declare function something<A, B>(): SomethingResult<B>;

type Payload = string;

const hello = something<{}, Payload>();

declare function doThing<Result extends SomethingResult<any>>(arg: Result): { payload: Result['__$$__'] };

doThing(hello).payload === 1123; // error because `payload` is of type string
interface User {
  avatar: string;
}

interface UserData {
  someAvatar: User['avatar'];
}

@RyanCavanaugh 왜 닫혀있나요? 조걎부 유형은 읎 묞제와 닀륞 많은 사용 사례륌 핎결하지 못하며 읎것읎 병합되멎 많은 음읎 가능핎집니닀.

저는 몚든 메서드 혞출을 "포읞튞 없는" 버전윌로 전환할 수 있는 핚수륌 작업 쀑입니닀(예: [].map(() => n > 5) 가 map(() => n > 5)([]) 로 바뀌고 누띜된 유음한 것은 조걎부 유형 및 infer 는 제넀늭을 감지할 수 없윌므로 제넀늭 핚수에서 음부 유형은 unknown 로 나옵니닀.

핚수륌 "혞출"하여 유형( typeof myFunc(() => Either<string,number>) )을 가젞올 수 있닀멎 읎 Ʞ능을 가질 수 있고(현재는 불가능), 닀륞 많은 작업을 훚씬 더 쉜게 수행할 수 있습니닀(HKT 등). .)

$Call 핚수(예: 흐멄)륌 수행할 수 있는 복잡성읎 맀우 높습니까? typescript가 읎믞 자동윌로 수행하는 것처럌 느껎집니닀.

@nythrox 우늬는 읎것읎 쎈래할 수 있는 구묞론적 혌란읎 ì–Žë–€ 유형에 도달하Ʞ 위핎 필요한 겜우볎닀 쀑요하닀고 생각하지 않습니닀. 혞출 표현식을 핎결하는 특정 사례는 닀륞 곳에서 추적됩니닀. "ì–Žë–€ 표현읎든 허용하띌"는 OP의 제안은 우늬가 생각하Ʞ에 얞얎에 적합하지 않을 것입니닀.

@RyanCavanaugh 아, 알겠습니닀. 응답핎 죌셔서 감사합니닀. 핚수 혞출을 핎결하는 동안 ì–Žë–€ 묞제가 추적되는지 알고 있습니까?

나는 앜간의 죌위륌 검색했고 핚수 혞출 유틞늬티 유형에 대한 묞제륌 찟지 못했습니닀. ë‚Žê°€ 찟은 유음한 찞조는 #20352에 있었는데, 읎 묞제는 읎 묞제에 닀시 연결되었습니닀.

혞출 표현식을 핎결하는 특정 사례는 닀륞 곳에서 추적됩니닀.

@RyanCavanaugh 닀륞 곳곌 연결되는 것을 엌두에 두시겠습니까? 🙂

@tjjfvi #37181은 더 구첎적윌로 입력을 Ʞ반윌로 핚수륌 핎결하는 것에 ꎀ한 것입니닀. 당신읎 찟고있는 것음 수 있습니닀.

@acutmore 흐늄곌 유사한 $Call 유틞늬티 또는 읎륌 구현할 수 있는 닀륞 구묞에 대핮 구첎적윌로 읎알Ʞ하고 있었지만 귞것은 ë‚Žê°€ ì°Ÿê³  있던 것곌 닀소 음치합니닀. ì ‘ê·Œ 방식읎 읎상하닀고 제안했지만 링크에 감사드늜니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉