Candid를 위한 TypeScript 유틸리티



사진 제공: Georgie Cobbs on Unsplash


웹 편집기 DeckDeckGoDFINITY 의 인터넷 컴퓨터로 포팅하기 위해 캐니스터 스마트 계약과 상호 작용하기 위해 TypeScript에서 여러 도우미를 개발했습니다.

그것이 당신의 삶을 더 쉽게 만들어 줄 수 있다면, 제가 가장 많이 사용하는 것들이 있습니다.


널 입력 가능



nullable 유형에 대해 생성된 설명Candid이 선택적 유형에 대해 JavaScript에서 일반적으로 사용하는 것과 정확히 일치하지 않습니다(이유 및 방법은 이post 참조).

예를 들어, 이러한 Motoko 코드 스니펫에 대한 인터페이스를 생성하는 경우:

actor Example {
  public shared query func list(filter: ?Text) : async [Text] {
    let results: [Text] = myFunction(filter);
    return results;
  };
}


선택적 매개변수filter의 정의는 잠재적으로 string일 수 있는 undefined로 해석되지 않고 오히려 array를 포함하거나 비어 있는 단일 요소 길이string로 해석됩니다.

export interface _SERVICE {
  list: (arg_0: [] | [string]) => Promise<Array<string>>;
}


그래서 선택적 값을 앞뒤로 변환하는 함수를 만들었습니다.

export const toNullable = <T>(value?: T): [] | [T] => {
  return value ? [value] : [];
};

export const fromNullable = <T>(value: [] | [T]): T | undefined => {
  return value?.[0];
};

toNullable 유형이 T 또는 undefined일 수 있는 개체를 IC와 상호 작용할 것으로 예상되는 것으로 변환하고 fromNullable 그 반대로 수행합니다.


날짜



시스템Time(1970–01–01 이후 나노초)이 bigint로 구문 분석되고 솔직한 정의에서 유형Time으로 내보내집니다.

export type Time = bigint;


JavaScriptDate를 큰 숫자로 변환하기 위해 내장 개체BigInt를 인스턴스화할 수 있습니다.

export const toTimestamp = (value: Date): Time => {
  return BigInt(value.getTime());
};


다른 방법은 먼저 큰 숫자를 원시Number 유형으로 변환하여 작동합니다.

export const fromTimestamp = (value: Time): Date => {
  return new Date(Number(value));
};

Nullable 타임스탬프 값을 지원하기 위해 변환기 위로 확장되고 적절한 선택적 배열을 반환하는 다음 도우미도 만들었습니다.

export const toNullableTimestamp = (value?: Date): [] | [Time] => {
  const time: number | undefined = value?.getTime();
  return value && !isNaN(time) ? [toTimestamp(value)] : [];
};

export const fromNullableTimestamp = 
       (value?: [] | [Time]): Date | undefined => {
  return !isNaN(parseInt(`${value?.[0]}`)) ? 
            new Date(`${value[0]}`) : undefined;
};



얼룩



Binaryblobs는 Candid에서 Arraynumbers로 설명됩니다. 유형이 지정되지 않은 데이터를 스마트 계약에 저장하기 위해(사용 사례가 그러한 위험을 허용한다고 가정) 프런트엔드 측에서 유형을 계속 유지하면서 개체를 만들고stringify Blob으로 변환하고 해당 내용을 ArrayBuffer에 포함된 이진 데이터로 가져올 수 있습니다.

export const toArray = 
       async <T>(data: T): Promise<Array<number>> => {
  const blob: Blob = new Blob([JSON.stringify(data)], 
                         {type: 'application/json; charset=utf-8'});
  return [...new Uint8Array(await blob.arrayBuffer())];
};

Arraynumbers를 특정 객체 유형으로 다시 변환하려면 Blob 유형을 다시 사용할 수 있지만 이번에는 텍스트 변환을 사용하여 결과를 구문 분석해야 합니다.

export const fromArray = 
       async <T>(data: Array<number>): Promise<T> => {
  const blob: Blob = new Blob([new Uint8Array(data)], 
                         {type: 'application/json; charset=utf-8'});
  return JSON.parse(await blob.text());
};


Blob 개체와 상호 작용하려면 JavaScript에서 Promise를 해결해야 하므로 두 변환 모두 비동기식입니다.


추가 자료



우리 프로젝트에 대해 더 알고 싶으세요? 다음은 인터넷 컴퓨터로 프로젝트를 시작한 이후 게시한 블로그 게시물 목록입니다.








  • 연락 유지



    우리의 모험을 따라가려면 GitHub repo ⭐️ 및 sign up에 별표를 표시하고 시청하여 베타 테스터 목록에 참여할 수 있습니다.


    결론



    이 짧은 블로그 게시물과 몇 가지 유틸리티가 인터넷 컴퓨터를 잘 시작하는 데 도움이 되기를 바랍니다. 정말 재미있는 기술입니다.

    무한과 그 너머로!

    다윗


    또는 mywebsite로 저에게 연락할 수 있습니다.

    다음 슬라이드를 위해 DeckDeckGo을 사용해 보십시오!

    좋은 웹페이지 즐겨찾기