Candid를 위한 TypeScript 유틸리티
13913 단어 blockchaintypescriptjavascriptmotoko
사진 제공: Georgie Cobbs on Unsplash
웹 편집기 DeckDeckGo 를 DFINITY 의 인터넷 컴퓨터로 포팅하기 위해 캐니스터 스마트 계약과 상호 작용하기 위해 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;
JavaScript
Date
를 큰 숫자로 변환하기 위해 내장 개체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에서
Array
의 numbers
로 설명됩니다. 유형이 지정되지 않은 데이터를 스마트 계약에 저장하기 위해(사용 사례가 그러한 위험을 허용한다고 가정) 프런트엔드 측에서 유형을 계속 유지하면서 개체를 만들고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())];
};
Array
의 numbers
를 특정 객체 유형으로 다시 변환하려면 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을 사용해 보십시오!
Reference
이 문제에 관하여(Candid를 위한 TypeScript 유틸리티), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daviddalbusco/typescript-utilities-for-candid-caj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)