facebook / facebook/flow

Provide a way to define tuple sucseccsion types

Aperta
#4,413 7 commenti 2 reazioni 0 assegnatari Vedi su GitHub
Accepting PRs feature request Has PR Typing: tuple
Lingua principale
Rust
Stelle
22.3k
Fork
1.9k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

There are some instances where it would be really useful to have a way to define a succession type for an existing tuple. I presumed something like this would work, but unfortunately it does not:

```js
type Prepend = [first, ...rest]
```

Here an example where something like this is necessary:

```js
type State = {
chunks Array,
parsed: values
}

interface Parser {
parse(state: State): Array>
}

class VariableParser implements Parser {
read: string => ?b
name: string
constructor(name: string, read: string => ?b) {
this.name = name
this.read = read
}
parse({ chunks, parsed }: State
): Array> {
if (chunks.length === 0) {
return []
} else {
const [first, ...rest] = chunks
const value = this.read(first)
if (value != null) {
return [
{
chunks: rest,
parsed: [value, ...parsed]
}
]
} else {
return []
}
}
}
}
```

Right now only option to do something along those lines requires either usage of trees: so instead of `Parser` -> `Parser` or functions `Parser b>` but both options lead to unpleasant interfaces to use and really confusing error messages. Here is a [complete example to illustrate](https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBTAHgBzgJwBcxCBPHDMAZUIENCMAeAN1pgFcMA+MAXjADeqMGADOGAOYBbDADtCogFxgAgvny1SjUYXwBLWRK4AaYWBy184gCbLWHDKgC+6bHiJgDDfFFoBjSgAFS3F8RlpjMAAjHiERCysMAAodegxlGjTwrgBKZTUNLUyGRhiTM3FpOUIk2VoZZR19QzywYMSwiOjykT8AC1oDRj8uJNoob2V20NLIkdbpjE65rmd0PxhaUVE2kKWVQIBJcMiYzykcGAwZeR3F5e7BMwBqBPFlFLoGDK+mWly+DwCppGMUmGUKpIbjU6g0xLoDBIFnsHmc4iIwPgMIR2PhZCQ+npRAA6fqDWS1DBIKhQ6r3Wr1DA5HJmFy9AZDEZjCZLKYo2ZgeZ8jonQWxMwiLE4vFgWRUsAAYQ5cus9MIhNEkXG3hZIhcLlQGy2OxpVXk92yYGwDFk1juKIOxy6-yeIgYWEIjQRhjMfjgsia7D8hAISXdnvhzSRroxonYFHwSV1GPVROJ4b4JGtrLMb2SAnMe2skUq0J2Th+WX+rWBRV+2XFGMF-p0gizHrATkzqdEEs8UDAKVpt2JV0M6r4vH4AAYcjGm1LcfiANoAXT7XYwMHE84xfoDxGXUD0VkIkWJF6xOlXmdL1V7TZEegHSWPp8n-HDc-Rj8x2KXYDLgWd63MoV5noWiTWJ266-pu26UD+j6LjKa59nqG45gaRrbGAACqsh6P6FpdGc1pyHauwdI6opormKJKFRMykVwaG9C2uhBiGiZ5lYwrMacrGrt+fZxgmSZ9j2xK8Ts-AyTm8R7J8aSViU1b5OoIJgqUXCNhiKH4rA9BSLQOBJLxgKQaE0lKakDA5JEUkycm+rrJsuEAGqWHotBRFcJGCVaHoUfa1FHKKy5RFqq56VitC2JGiKWQA-FEZiwukiU+uxB74FxoYZV6UaRHFCVNElvA8KlIlNmJSwSU2UkZZmGWSRqxKlZmpUKVZ+ZiMOCiRHm0EVtQ9bqaoml1lkkXRbpu7PoOIEKKOcgSBOU4zjVyH-qhsEYvBO5ITlrbLnKHrnpeGDXreA0Po++6tv07CyAA1t27WlZSHrJk2i1JM9b1gAAhPwsjsDAMDbb+BmAehj7Hb+-VmgoYHXWe8O-sNyjLoDr1DUW+1I52mNgETB1Wghu4LrtK7kxhTZsiT2HuTsSrkhgqr8qRKxBTalH3DRXQjDGUQYFABCZQF3RmNqvJMUsAojL6HF5cGoZixLWL8YrLFajy+A62EUVitDYjxvVv0EmmmuS5mttYm1aZy-gmYuz1ebKd8Y1VrkGmFKC9YjHpJ3EAWDsYPr3idh9RJ9rDRmECZZle5l2kxHOlVgC7NmJKnDnROLku5+I+cuWsmC4AQxCPTXyqZrRKxJGYEdG7RPTZwbbcm8ryIisLPBZ3KSDswYnP0hHUdLCylfuDXHFgKw+i+VcDcsc3IiFVlEimJKGDxUVFVVWlfcCYBJu0DFlnD2AXnL35GD0hlJX79YM9uNXzYHsj0Jr6M4aHxaG3Z0g9Vib3lKaaEaprTvyrh4Wu28-4MjhOVQwmYABEqCJDoNPrrSIy4sFzUBGYJePkH7IMjp4aw1Q9BkFgXPL+rYvCSCWEgreWCMGHHkCw-AODgH4PBlIMW+AiGVRId5FeyRn5-nilwhgEhp7rAXqVORPDMxJAMDgdgEYsGtGSoI4Rll0QIPsJwTMeYABi8B6AaNkFowgyZ-oADl2BCKWMSIkqiFGJlMUyM2sNfGskpkdeOtNZQQxgFhJR39E7JzXoJV8HxNHaOULQTOQIpo6S1FNf2IIJq1h0sQkQa5ST+j8DYi8xJLCFGJMnV8zJolMOofIWhpAkG+NSa0WgllAmz0-ggvMSD6IdDbuDSGWoO64hgIAnewz6iMQLMuV6GBSAzNXDMkmejulZ2MQvUhtBbjmJRCXPqy1GKiEuLQvCAAlAAMkkKZBdsbhMhp2ZMsM8wAAktxmX2bcFk2EF5fJ+Uguy11cnTTUrpLZRizD-TBSSMc60+gfjALOXcsMxmRL1MExCfYEEEN+JdDq6Mbz8ARX2eFvxiRnNWuOFFm00Vmz3tKfEYKTnWA3Li-sS1qW0qRRtKcYAACMYAABkYr4RpBpXdZc04yVCvQTg6mf5WVSoYByrlW4QkwzCcCmAZlwJWyZq5Pp8CF4XJgFcu56ipkzNaFgtcsLQ4-3vJmKZNLLk1HQcAHBcKXz8rWhOHg05xWSrOXKhV-AlX+LCbS0QVqAhJGFS5blSFYZnKiagMgFAFaWn4BaEAEz0DMJ8P4IIewVA7HRKKOA2jRi8R1owZcXQsUxUiGMdJYA60QTtdvPRPbd5gEbt2+t5kURNtmoBVtETVztsHKRLtg6wB9t0coZKg6zAjr8JEHtow+yNrzbjfBJsW2RDbXOjuIgxinDmEu7RQ6RCru9BIMwA6H1bp5oKSIxZR2EH3U2Q9ixm2-uPeffBM7IZzsvY+hdt7v1gDfpZTdTZn1RjfeulDw6v07sQ5EShe6N4YiA3sZtlDlygdw1Os9LyYDQZg32G90Q5g-vw-ejGqH8DTO3hhsAG6P0iG3axq0kQoC7rHQeidR6xOAXI5Rk9EHz2zvo+2xjOHhOUKgOx2DaHES8f4xx7D8HcO-s05EHef6APEak8B5cFmjz4Lk-gqjp7IN0ZU6ppsTGe4adE+Z7TfZdPZTAO+wzQm8MibADJizfRxP-qI4pEZR7YuAXszJ5cTnAIucU7RjzDGvPqYi2ZsAMWAuce41g-TPaK4DMrYxRYVb1Hhd-dFyIKXCPDNCEOkMXkHBDqC6+0LzrGHEGsPQbZvVx0dEiFMyIAgnCOJfGNugIMwYRLNggywEhZKAXJlcYg4FMzLdoH2BAhJV5JEO6DWjzKRuAT6K-Rygw6NdXRvDQ7n5nvwy2ySF6ohCQTCSA9+KxrQlqp62wTgSRKk-dTdqvFNM1VYqwqk2QpAWTADQIaBeUyMHAHYKEYAUQ4BRGAH6KQZZgAABYABM6DsffwJ0sBUcAKd0hRLdFGSR0FM94cmUkypPhRm5xlHB-Plrc-J2WP1IgBfklsfI+q6C9DWDF+gPMVaHmhBZ2z80KIO3sJfZEFXygDHT0skkAs0iVdvJm1xmeGvRBa+Z6zqB+vByG+KlQ+1FureMmNyNAujzUBAA) this case, here is a tiny summary:

```js
const url = "/user/bob/comments/42"
const userCommentParser = segment("user")
.chain(string("name"))
.segment("comments")
.chain(integer("id"))

parseAs(userCommentParser, (name: string, id: number) => ({ name, id }), url)

parseAs(userCommentParser, (name: string, id: string) => ({ name, id }), url) // <- fails due to type mismatch for `id` argument
```
```
230: parseAs(userCommentParser, (name: string, id: string) => ({ name, id }), url)
^ function call. Function cannot be called on any member of intersection type
167: (parser: Parse<[a, null]>, (a) => out, url: string): ?out,
^ intersection
```

Guida per i contributori

Apri la guida per i contributori

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.