programing

'any' vs 'Object'

newsource 2023. 3. 26. 11:26

'any' vs 'Object'

TypeScript 코드를 보고 있는데 다음 코드를 사용하고 있습니다.

interface Blablabla {

   field: Object;

}

를 사용하면 어떤 이점이 있습니까?Object »any예를 들어 다음과 같습니다.

interface Blablabla {

  field: any;

}

좀 낡긴 했지만, 메모를 추가하는 것은 나쁘지 않습니다.

이런 거 쓸 때

let a: any;
let b: Object;
let c: {};
  • a에는 인터페이스가 없습니다.어떤 것이든 상관없습니다.컴파일러는 멤버에 대해 아무것도 모르기 때문에 컴파일러와 그 멤버에 대한 액세스 또는 액세스 시 타입 체크는 실행되지 않습니다.기본적으로 컴파일러에게 "물러서, 내가 하는지 아니까 그냥믿어"라고 말합니다.
  • b에는 오브젝트인터페이스가 있기 때문에 그 인터페이스에 정의된 멤버만 b에 사용할 수 있습니다.아직 JavaScript이기 때문에 모든 것이 Object를 확장합니다.
  • c TypeScript의 다른 항목과 마찬가지로 오브젝트를 확장하지만 멤버는 추가하지 않습니다.TypeScript의 타입 호환성은 공칭 서브타이핑이 아닌 구조 서브타이핑을 기반으로 하기 때문에 c는 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

★★★★★★★★★★★★★★★★★.Object ★★★★★★★★★★★★★★★★★」{}[ TypeScript ]를 선택합니다.

다음과 같은 함수를 선언하면

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

param을 위해 무엇이든 받아들이기 위해 (실행 시 타입을 체크하여 어떻게 할지를 결정할 수도 있음)

  • fa 내부에서는 컴파일러가 param을 사용하여 원하는 모든 작업을 수행할 수 있습니다.
  • fb 내에서는 컴파일러는 오브젝트의 멤버만 참조할 수 있습니다.

단, 파라미터가 복수의 알려진 타입을 받아들이도록 되어 있는 경우, 보다 나은 접근방식은 다음과 같이 유니언 타입을 사용하여 그것을 선언하는 것입니다.

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 타입이 : "type"은 "type"은 "type: "type"은 "type"이 아닙니다.number,string,boolean,symbol,undefined , 「」null를 참조해 주세요.

다음과 같이 정의된 함수를 고려합니다.

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

x는, 이러한 할 수 만, 로 콜 것은 타입 d"CHANGE: " "CHANGE: "CHANGE:

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

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에는 class음음 class class classnomethod()따라서 트랜스필러가 정확하게 이를 알려주는 오류를 생성합니다.「 」를 사용하고 any입니다.트랜스필러에게 어떤 되어 있는지 있습니다.a든 될 수 ! - 뭐든 될 수 있어!을 할 수 해줍니다.any.

요컨대

  • any무엇이든 될 수 있습니다(컴파일 오류 없이 임의의 메서드 등을 호출할 수 있습니다).
  • Object, 에 되어 있는 .Object를 누릅니다

anyAlex TypeScript 。

Object는 JavaScript JavaScript를 .object으로 type으로 됩니다. 일반적으로 다음과 같이 사용됩니다.{} 가끔 (가끔)new Objectjavascript의 대부분의 내용은 오브젝트 데이터형과 호환되며, 오브젝트 데이터형에서 상속됩니다.그렇지만any는 TypeScript 고유의 것으로, 양방향(상속 베이스가 아님)의 모든 것에 대응하고 있습니다.예:

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에서는 모든 유형이 "임의"에서 파생됩니다.나는 단지 이 비교가 더 많이 만들어진 흔한 비교가 될 것이라고 생각하기 때문에 덧붙이고 싶었다.NET 개발자는 TypeScript를 사용해 봅니다.

개체는 다른 개체보다 더 구체적인 선언인 것 같습니다.TypeScript 사양(섹션 3)에서 다음을 수행합니다.

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

기타:

Any 타입은 임의의 JavaScript 값을 나타내기 위해 사용됩니다.Any type 값은 JavaScript 값과 동일한 작업을 지원하며 Any 값에 대한 작업에 대해 최소한의 정적 유형 검사가 수행됩니다.특히 임의의 이름의 속성은 Any 값을 통해 액세스할 수 있으며 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의 답변에 추가 및 심플화:

오브젝트는 그 사용에 더 엄격하기 때문에 프로그래머에게 더 많은 컴파일 시간의 "평가" 파워를 부여하기 때문에 많은 경우 더 많은 "검사 기능"을 제공하고 누수를 방지할 수 있습니다. 반면, 어떤 것도 더 일반적인 용어이므로 많은 컴파일 시간 체크는 무시될 수 있습니다.

데이터에 여러 개의 키와 값 쌍이 있는 경우 개체를 사용해야 합니다. 이는 모든 종류의 데이터를 받아들이기 때문입니다. 이는 경우에 따라서는 더 낫지 않다는 것을 의미합니다.예를 들어, 2개의 숫자를 더하는 경우 스트링을 지정하면 데이터가 숫자 데이터 유형으로 지정되어야 함을 의미합니다. 대부분의 경우, 우리는 any를 사용하지 않습니다.

언급URL : https://stackoverflow.com/questions/18961203/any-vs-object