2017-02-24 1 views
4

업데이트에서 유형 검사에 대한 고정 된 크기의 배열을 선언하는 방법 : 이러한 검사는하지 런타임에서 컴파일 시간 의미한다. 내 예제에서는 실패한 사례가 모두 컴파일 타임에 잡히고, 다른 경우에는 의 경우와 비슷한 동작이 예상됩니다. 경우에 실패합니다.타이프 : 컴파일 시간

class MyClass { 
    tableHead: string[3]; // expect to be a 3 element array of strings 
    tableCells: number[3]; // expect to be a 3 element array of numbers 
} 

지금까지 발견 한 가장 가까운 솔루션입니다 :

가정하자 나는 내가 좋아하는 같은 길이의 배열, 뭔가하는 클래스의 모든 구성원을 원하는 테이블 같은 클래스를 쓰고 있어요 :

class MyClass { 
    tableHead: [string, string, string]; 
    tableCells: [number, number, number]; 
} 

let bar = new MyClass(); 
bar.tableHead = ['a', 'b', 'c']; // pass 
bar.tableHead = ['a', 'b'];  // fail 
bar.tableHead = ['a', 'b', 1]; // fail 

// BUT these also pass, which are expected to fail at compile time 
bar.tableHead = ['a', 'b', 'c', 'd', 'e']; // pass 
bar.push('d'); // pass 
bar.push('e'); // pass 

더 좋은 아이디어가 있습니까?

+0

액세스 기능에 회원 데이터를 래핑해야합니다. 그러면 인수에 추가 할 데이터의 인수 및/또는 길이를 확인할 수 있습니다. –

+0

'getter'와'setter'를 의미합니까? – benjaminz

+0

예. 비공개로 만들고 목록에서 푸시되거나 제거되는 것을 제어하는 ​​메소드를 제공하십시오. 그럼 내가 제대로 이해하면 – iberbeu

답변

0

다음은 내부 배열의 길이를 제어하는 ​​클래스의 간단한 예입니다. 그것은 바보 - 증거가되지 않는다 (점점/당신이 얕은 여부를 고려할 수 있습니다 설정/깊은 복제 등 :

https://jsfiddle.net/904d9jhc/

class ControlledArray { 

    constructor(num) { 
    this.a = Array(num).fill(0); // Creates new array and fills it with zeros 
    } 

    set(arr) { 
    if (!(arr instanceof Array) || arr.length != this.a.length) { 
     return false; 
    } 
    this.a = arr.slice(); 
    return true; 
    } 

    get() { 
    return this.a.slice(); 
    } 

} 

$(document).ready(function($) { 

    var m = new ControlledArray(3); 

    alert(m.set('vera')); // fail 
    alert(m.set(['vera', 'chuck', 'dave'])); // pass 

    alert(m.get()); // gets copy of controlled array 

}); 
+0

답변을 주셔서 감사합니다. 질문 아래의 토론에서 볼 수 있듯이이 작업을 수행하려고했습니다. 런타임에 ** 컴파일 시간 **을 확인하십시오.미래의 혼란을 피하기 위해 질문을 업데이트하고 있습니다. – benjaminz

3

내가 그것을가 가능하다고 생각하지 않습니다를 입력-확인 튜플의 길이. Here의이 주제에 타이프 라이터의 저자의 의견.

나는 당신을 위해 무엇을 요구하는지하는 것은 필요하지 않다고 주장 할 것입니다.이 유형을 정의한다고 가정

type StringTriplet = [string, string, string] 

및 해당 유형의 변수 정의 : 당신은 예를 들어, 그 삼중에서 더 많은 변수를 얻을 수

const a: StringTriplet = ['a', 'b', 'c'] 

const [one, two, three] = a; 

나는 길이를 제한 할 수있는 능력의 부족하게 생각하는 유일한 상황은 문제가 예입니다 :

const [one, two, three, four] = a; 

이 예상되지 않는 반면, 오류를 줄 것이다 그건 있도록 삼중

const result = a.map(/* some pure function */) 

사실은 그러나 이상 (3)을 가질 수 있습니다 때 result이 경우, 3 개 요소가 기대 이상 map, 당신은 모음 대신 어쨌든 튜플로 a을 치료하는 경우 튜플 구문에 올바른 사용 사례가 아닙니다.

+0

좋은 답변입니다. Hejlsberg의 의견을 포함하고 배경을 이해하는 데 도움이됩니다. – sleske