문자열 키와 Record
문자열 리터럴 타입의 유니온은 키 타입입니다. 채널이나 모드처럼 사용할 이름이 정해진 값 집합을 나타냅니다.
키 타입
컴파일러는 멤버를 UTF-16 코드 단위로 정렬하고 각 멤버에 u32 id를 부여합니다. 문자열 리터럴 타입 하나도 키 타입입니다. 멤버 집합이 같으면 id도 같습니다. 모든 타깃에서 GPU는 이 id를 받습니다.
키는 동등 비교와 멤버를 나누는 switch를 지원합니다. 산술 연산, 대소 비교, 숫자로의 변환은 거부됩니다. 키 타입이 필요한 자리에 쓴 문자열 리터럴은 해당 멤버가 됩니다. 값 집합이 열린 string은 계속 거부됩니다.
Record
Record<K, V>는 K의 멤버마다 V 값 하나를 담으며, id 순서의 고정 배열로 표현됩니다. by[c], by.r, by["r"]로 원소를 선택합니다. 객체 리터럴은 모든 멤버를 포함하고 추가 프로퍼티는 없어야 합니다. 다른 키 타입, 숫자, .length는 거부됩니다.
"use typeshade";type Channel = "r" | "g" | "b";export function gain(c: Channel, by: Record<Channel, f32>): f32 { return by[c];}숫자 키
서로 다른 값이 정확히 0부터 N-1까지인 enum이나 정수 리터럴 유니온은 Record의 키가 될 수 있습니다. 각 멤버는 자신의 값으로 인덱싱합니다. 건너뛴 값, 음수, 정수가 아닌 값은 실제 값을 명시한 문장으로 거부됩니다. 값 집합이 열린 Record<u32, V>도 거부됩니다.
호스트 호출
호스트에서 키 매개변수나 반환값은 문자열입니다. Record 매개변수나 반환값은 모든 멤버를 갖춘 객체입니다. 알 수 없는 문자열, 빠진 프로퍼티, 추가 프로퍼티는 TypeError를 냅니다.
import { gain } from './gain.shade.ts';const value = gain('g', { r: 1.2, g: 1, b: 0.8 });진입점 바인딩과 크기를 지정하지 않은 커널 배열에서는 키가 숫자 id이고, Record는 id 순서의 배열입니다. 제안 0081은 이 차이를 D1으로 열어 둡니다.
Map과 Set
커널은 Map<Channel, V>와 Set<Channel>을 받습니다. 호스트는 문자열 키를 넘깁니다. 호출은 루프를 실행하기 전에 키를 id로 바꾸고, 끝난 뒤에는 문자열로 되돌리며 삽입 순서를 유지합니다. 알 수 없는 문자열은 TypeError를 냅니다. 값 집합이 열린 Map<string, V>와 Set<string>은 거부됩니다.
string-keys-record는 WebGPU, WebGL2, CPU에서 Record를 인덱싱하는 커널을 호출합니다. 제어 흐름은 컬렉션 루프와 지원 tier를 설명합니다.