Saya memiliki tipe yang terlihat seperti ini:

type Location=`${number},${number};${number},${number};...`

Apakah ada jenis Utilitas seperti Repeat<T> yang dapat melakukan ini untuk saya? seperti ini:

type Location=Repeat<`${number},${number};`>
3
hyisYoo 15 Januari 2022, 07:36
Mengapa tidak memberikan tipe sebagai string
 – 
decpk
15 Januari 2022, 07:37
Karena saya ingin mempersempit tipe saya
 – 
hyisYoo
15 Januari 2022, 07:43
Lalu deklarasikan saja dengan const location = any_value lalu ketikkan any_value...
 – 
decpk
15 Januari 2022, 07:44

4 jawaban

Saya tidak berpikir ada cara untuk mendefinisikan pola pengulangan tak terbatas untuk tipe yang Anda gunakan pada deklarasi variabel.

Namun, penjaga tipe pada fungsi dapat memeriksa bahwa string cocok dengan pola yang tak terbatas, seperti (taman bermain):

type MatchesPattern<Pattern extends string, Current extends string> = Current extends `` ? string : (Current extends `${Pattern}${infer Rest}` ? MatchesPattern<Pattern, Rest> : never);

type LocationPattern = `${number},${number};`;

declare function onlyAcceptsLocation<L extends string & IsLocation, IsLocation = MatchesPattern<LocationPattern, L>>(location: L): void;

onlyAcceptsLocation("12,34;56,78;"); // 👍 matches 

onlyAcceptsLocation("12,34;56,78"); // ⚠️

onlyAcceptsLocation("12'34;56,78;"); // ⚠️

onlyAcceptsLocation("1,2,3;45,67;"); // ⚠️
2
David Shortman 15 Januari 2022, 08:47

Anda dapat langsung memilih jenis string jika Anda ingin sebagai:

type myLocation = string;
const myLocation: myLocation = "123123123";

console.log(myLocation);

Lain jika Anda ingin mempersempitnya maka lebih baik mendeklarasikannya const sebagai:

const myLocation = "123123123";
console.log(myLocation);

Maka tipe Anda akan menjadi nilai myLocation

enter image description here

0
decpk 15 Januari 2022, 07:51

HANYA BERFUNGSI DI TS >=4.5

Dimungkinkan untuk membuat tipe mandiri.

Silakan lihat contoh ini:

type Coordinates = `${number},${number};`

type MAXIMUM_ALLOWED_BOUNDARY = 50

type Last<T extends string[]> = T extends [...infer _, infer Last] ? Last : never;

type ConcatPrevious<T extends any[]> = Last<T> extends string ? `${Last<T>}${Coordinates}` : never

type Mapped<
    N extends number,
    Result extends Array<unknown> = [Coordinates],
    > =
    (Result['length'] extends N
        ? Result
        : Mapped<N, [...Result, ConcatPrevious<Result>]>
    )


// type MyLocation = 
// | `${number},${number};` 
// | `${number},${number};${number},${number};` 
// | `${number},${number};${number},${number};${number},${number};` 
// | `${number},${number};${number},${number};${number},${number};${number},${number};` 
// | `${number},${number};${number},${number};${number},${number};${number},${number};${number},${number};` 
// | ... 44 more ... 
// | `${number},${number};${number},${number};${number},${number};${number},${number};${number},${number};${number},${number}; ....

type MyLocation = Mapped<MAXIMUM_ALLOWED_BOUNDARY>[number]

const myLocation1: MyLocation = '45,56;67,68;' // ok
const myLocation2: MyLocation = '45,56;67,68;1,2;3,4;5,6;7,8;9,10;' // ok
const myLocation3: MyLocation = '45,56;67,68;1,2;3,4;5,6;7,8;9,10,' // expected error

Tempat bermain

Tipe Mapped adalah tipe utilitas yang mewakili loop while. Iterasi sampai panjang Result akan mencapai N. Dengan kata lain Mapped<10> - akan diulang 10 kali. Lihat contoh ini di js murni:

const mapped = (N: number, Result: any[] = []): string => {
    if (N === Result.length) {
        return Result.join('')
    }
    
    const x = Math.random();
    const y = Math.random()
    return mapped(N, [...Result, `${x},${y};`])
}

Sulit untuk merepresentasikan serikat pekerja di js, itu sebabnya saya menggunakan join(''). Saya harap jelas cara kerjanya.

Jika Anda ingin meningkatkan MAXIMUM_ALLOWED_BOUNDARY menjadi 500, itu akan memanaskan CPU Anda, jadi berhati-hatilah.

Seperti yang mungkin Anda perhatikan, tidak mungkin dalam skrip tipe untuk mewakili pola rekursif untuk tipe tetapi dimungkinkan untuk membuat penyatuan yang cukup besar.

Harap diingat bahwa ada beberapa kelemahan dari tipe ${number}. Anda diperbolehkan menggunakan angka dengan awalan nol seperti di sini:

const x: `${number}` = '01'.

Tautan yang berguna:

  1. Di sini Anda dapat menemukan contoh cara membuat rentang angka menggunakan pola ini.

  2. Di sini Anda dapat menemukan PR tempat fitur ini diperkenalkan

  3. Di sini dan di sini Anda dapat menemukan artikel saya yang terkait dengan pola ini

0
captain-yossarian 15 Januari 2022, 12:31

Anda dapat menggunakan pernyataan as const untuk mendapatkan tipe literal string dari literal templat, seperti ini:

Taman Bermain TS

const str1 = 'str1';
const str2 = `${str1},${str1};${str1},${str1}` as const; // type is "str1,str1;str1,str1"
-1
jsejcksn 15 Januari 2022, 10:13