[typescript] ‘any’대 ‘Object’

TypeScript 코드를보고 있는데 다음을 사용하는 것으로 나타났습니다.

interface Blablabla {

   field: Object;

}

다음 과 같이 Objectvs 를 사용하면 어떤 이점이 있습니까 any?

interface Blablabla {

  field: any;

}



답변

Object보다 제한적 any입니다. 예를 들면 다음과 같습니다.

let a: any;
let b: Object;

a.nomethod(); // Transpiles just fine
b.nomethod(); // Error: Property 'nomethod' does not exist on type 'Object'.

Object클래스는 없습니다 nomethod()때문에 transpiler 정확하게 당신을 말하는 오류가 발생합니다, 기능. 당신이 사용하는 경우 any대신 기본적으로 아무것도, 당신이 저장되는 대한 정보를 제공하지 않습니다가는 것을 transpiler을 말하고있다 a– 그것은 아무것도 될 수 있습니다! 따라서 트랜스 파일러는로 정의 된 것을 사용하여 원하는 모든 작업을 수행 할 수 있습니다 any.

요컨대

  • any 무엇이든 될 수 있습니다 (컴파일 오류없이 메소드를 호출 할 수 있습니다)
  • ObjectObject클래스에 정의 된 함수와 속성을 노출합니다 .

답변

조금 낡았지만 메모를 추가해도 아프지 않습니다.

이런 식으로 쓸 때

let a: any;
let b: Object;
let c: {};
  • a 는 인터페이스가 없으며 무엇이든 될 수 있습니다. 컴파일러는 멤버에 대해 아무것도 모르므로 해당 멤버와 멤버 모두에 액세스 / 할당 할 때 유형 검사가 수행되지 않습니다. 기본적으로, 컴파일러에게 ” 뒤로, 내가 뭘하는지 알고 있으니 믿어 줘 “라고 말하고 있다.
  • b 에는 Object 인터페이스가 있으므로 해당 인터페이스에 정의 된 멤버 만 b에 사용할 수 있습니다 . 여전히 JavaScript이므로 모든 것이 Object를 확장합니다.
  • c 는 TypeScript의 다른 것과 마찬가지로 Object를 확장하지만 멤버는 추가하지 않습니다. TypeScript의 유형 호환성은 공칭 하위 유형이 아닌 구조적 하위 유형을 기반으로 하기 때문에 c 는 동일한 인터페이스 (Object 인터페이스)를 갖기 때문에 b 와 동일합니다.

그리고 그 이유입니다

a.doSomething(); // Ok: the compiler trusts you on that
b.doSomething(); // Error: Object has no doSomething member
c.doSomething(); // Error: c neither has doSomething nor inherits it from Object

그리고 왜

a.toString(); // Ok: whatever, dude, have it your way
b.toString(); // Ok: toString is defined in Object
c.toString(); // Ok: c inherits toString from Object

따라서 TypeScript Object{}동일합니다.

이런 함수를 선언하면

function fa(param: any): void {}
function fb(param: Object): void {}

param에 대한 모든 것을 받아 들일 의도로 (런타임에 유형을 확인하여 관련 작업을 결정할 수 있음)

  • fa 내부 에서 컴파일러는 param으로 원하는 모든 것을 수행 할 수 있습니다 .
  • fb 내부 에서 컴파일러는 Object 의 멤버 만 참조 할 수 있습니다 .

그러나 매개 변수 가 알려진 여러 형식을 허용해야하는 경우 보다 나은 방법은 다음과 같이 공용체 형식을 사용하여 선언하는 것입니다.

function fc(param: string|number): void {}

분명히 OO 상속 규칙이 여전히 적용되므로 파생 클래스의 인스턴스를 허용하고 기본 유형에 따라 인스턴스를 처리하려는 경우

interface IPerson {
    gender: string;
}

class Person implements IPerson {
    gender: string;
}

class Teacher extends Person {}

function func(person: IPerson): void {
    console.log(person.gender);
}

func(new Person());     // Ok
func(new Teacher());    // Ok
func({gender: 'male'}); // Ok
func({name: 'male'});   // Error: no gender..

기본 유형하지, 그것을 할 수있는 방법입니다 어느 . 그러나의 OO 것으로, 범위를 벗어난, 난 그냥 명확히하고 싶었 라도 당신이 무슨 일 오는 알 수없는 경우에만 사용되어야하며, 다른 용도로 올바른 유형의 주석을해야한다.

최신 정보:

2.2 타이프 추가 object유형 값이 비 프리미티브되도록 지정 (즉하지 number, string, boolean, symbol, undefined, 또는 null).

다음과 같이 정의 된 함수를 고려하십시오.

function b(x: Object) {}
function c(x: {}) {}
function d(x: object) {}

x이 모든 함수 내에서 동일한 속성을 사용할 수 있지만 d프리미티브 로 호출하는 것은 유형 오류입니다 .

b("foo"); //Okay
c("foo"); //Okay
d("foo"); //Error: "foo" is a primitive


답변

any Alex의 답변에 의해 TypeScript에 특정한 것이 잘 설명되어 있습니다.

ObjectJavaScript object유형을 나타냅니다 . 일반적으로 {}또는 때때로 사용됩니다 new Object. 자바 스크립트의 대부분 은 객체 데이터 유형에서 상속되는 객체 데이터 유형과 호환됩니다. 그러나 any입니다 타이프 라이터의 (상속을 기반으로하지) 특정 두 방향 모두와 호환. 예 :

var foo:Object;
var bar:any;
var num:number;

foo = num; // Not an error
num = foo; // ERROR 

// Any is compatible both ways 
bar = num;
num = bar;  


답변

모든 유형이 “객체”에서 파생되는 .NET과 달리 TypeScript에서는 모든 유형이 “any”에서 파생됩니다. 더 많은 .NET 개발자가 TypeScript를 사용해 볼 때 일반적인 것으로 생각 되므로이 비교를 추가하고 싶었습니다.


답변

객체가 어느 것보다 더 구체적인 선언 인 것 같습니다. TypeScript 사양 (섹션 3)에서 :

TypeScript의 모든 유형은 Any 유형이라는 단일 최상위 유형의 하위 유형입니다. any 키워드는이 유형을 참조합니다. Any 유형은 제약 조건없이 모든 JavaScript 값을 나타낼 수있는 유형입니다. 다른 모든 유형은 기본 유형, 객체 유형 또는 유형 매개 변수로 분류됩니다. 이러한 유형은 값에 다양한 정적 제약 조건을 도입합니다.

또한:

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

객체는 동일한 유연성을 허용하지 않습니다.

예를 들면 다음과 같습니다.

var myAny : any;

myAny.Something(); // no problemo

var myObject : Object;

myObject.Something(); // Error: The property 'Something' does not exist on value of type 'Object'.


답변

Alex의 답변에 추가하고 단순화하십시오.

객체는 사용이 더 엄격하므로 프로그래머에게 더 많은 컴파일 시간 “평가”파워를 제공하므로 많은 경우 더 많은 “체크 기능”을 제공하고 누수를 방지 할 수 있습니다. 반면에 더 일반적인 용어이며 많은 컴파일 따라서 시간 확인은 무시 될 수 있습니다.


답변