2017-05-15 1 views
3

인터페이스를 구현할 때 TypeScript에서 함수의 반환 형식을 특정 형식의 'any'형식으로 오버로드 할 수있는 이유를 결정하려고합니다.인터페이스를 구현할 때 TypeScript가 'any'로 반환 형식의 오버로드를 허용하는 이유

내 경우 엔 Angular로 작업 중이며 구현 된 클래스를 주입하고 있습니다.

내 환경 :

비주얼 스튜디오 2017

각도 버전 1.5.5

타이프 라이터 버전 다음 코드는 어떤 문제없이 컴파일 2.1.5

:

export interface IFoo { 
    thing: (parameter: number) => string; 
} 

export class BarService implements IFoo { 
    public thing = (parameter: number): any => { 
     return { "whatever": parameter }; 
    } 
} 
angular.module("FooBar").service("barService", BarService); 

그래서 IFoo inter를 소비하려고 할 때 얼굴과 '일'함수 호출에서 반환되는 문자열을 기대하고 컴파일러는 실제로 그것이 일어날 수 있습니다!

export class Whatever { 
    public foo: IFoo; 
    public myString: string; 

    static $inject = ["barService"]; 
    constructor(barService: IFoo) { 

     this.foo = barService; 

     this.myString = this.foo.thing(0); 
    } 
} 

그것은 반환 형식이 형식에 과부하시 타이프 라이터 컴파일 실패 할 것 같다 '어떤'인터페이스의 소비자는 강력한 형식의 객체를 기대하고 있기 때문이다.

+1

'any'의 전체 점이 절대 유형 오류의 원인이되지 않아야합니다 –

답변

2

내가 any에 대한 이해를 기반으로 타이프 라이터에 대한 전문가 모르겠지만 :

https://www.typescriptlang.org/docs/handbook/basic-types.html

우리는 해당 페이지의이 댓글을 찾을 수 :

"우리는 옵트 아웃 할 유형을 -checking하고 값을 컴파일 타임 검사를 통과하게하십시오. "

그래서 컴파일러가 any을 볼 때 "나는이 유형을 확인하지 않을 것"이라고 생각합니다. 이 조건은 컴파일러가 함수가 올바르게 구현되었다고 가정하는 데 충분해야합니다.

나는 any을 "받아 들일 수있는 것"으로 생각했습니다. 하지만 더 정확하게 말하면 "내가 원하는 것에서 이것이 당신이 원하는 유형이라고 가정하십시오."라는 뜻입니다. 따라서이 경우 컴파일러는 사용자의 편의를 위해 string이라고 가정하고 컴파일 시간 검사를 통과 할 수 있습니다.

1

내가보기에 TypeScript 컴파일러가 실패 할 것으로 예상되는 곳은 두 곳입니다. thing() 함수의 반환 값을 myString으로 지정하는 any 및 Whatever 클래스를 반환하는 BarService

TypeScript에서 any/all Types의 substitude로 any를 사용할 수 있기 때문에 BarService에서 반환 할 때 컴파일러가 실패하지 않습니다. TypeScript의 any 유형은 주로 이전 자바 스크립트 라이브러리 또는 코드를 지원하기 쉽게 만드는 것으로 생각됩니다. 여기에있는 모든 섹션 : https://www.typescriptlang.org/docs/handbook/basic-types.html을 확인하십시오. 그렇습니다. 학대 당할 수도 있고 학대 당할 수도 있습니다.

사실 여기서 what() 함수가 문자열을 반환한다고 말하는 인터페이스를 사용하기 때문에 Whatever 클래스에서 컴파일러가 실패하지 않습니다. 컴파일러는 Whatever 클래스를 컴파일 할 때 BarService에 대해 알지 못합니다.

3

다음은 내가 함께 작성한 것입니다.https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.1에서

: 타이프의

모든 종류의 모든 유형 라는 단일 상위 유형의 하위 유형입니다. any 키워드는이 유형을 참조합니다. Any 유형은 제약없이 JavaScript 값을 나타낼 수있는 유형 인 입니다.

또한 :

모든 유형의 자바 스크립트 값을 나타내는 데 사용됩니다. 모든 유형은 JavaScript의 값과 동일한 조작을 지원하며 Any 값의 조작에 대해 최소한의 정적 유형 점검이 수행됩니다. 특히 임의의 이름의 속성은 Any 값을 통해 액세스 할 수 있으며 Any 값은 모든 인수 목록이있는 함수 또는 생성자로 호출 할 수 있습니다.

주위 재생 : 우리는 어떤이 문서를 다음 유형의 시스템을 대체하는 데 사용할 수있는 위, 심지어 간단한 예에서 볼 수

interface IPerson { 
    name: string 
} 

class Person implements IPerson { 
    name: any; 
} 

// Error 
//class Person2 implements IPerson { 
// name: number; 
//} 

const person: Person = new Person(); 
person.name = 3; 

let x: number = 3; 
x = <any>"hello"; // Works! 

//x = "hello"; // Error 

.

제 생각에이 동작은 자바 스크립트의 유형이 지정되지 않은 (유연한) 동작의 유연성을 허용합니다.

관련 문제